swift编程语言中的相关类型是什么?它们用于什么?
根据swift编程语言书:
定义协议时,将一个或多个关联类型声明为协议定义的一部分有时很有用.关联类型为作为协议一部分的类型提供占位符名称(或别名).在采用协议之前,不会指定用于该关联类型的实际类型.使用typealias关键字指定关联类型.
上面的文字对我来说不是很清楚.如果您可以通过示例解释相关类型,那将会有很大帮助.
另外,为什么将关联类型声明为协议定义的一部分有用呢?
Jer*_*myP 14
您有一个协议,它定义了实现类型必须提供的方法和属性.其中一些方法/属性使用或返回不同类型的对象到实现协议的类型.因此,例如,如果您有一个定义某些类型的对象集合的协议,您可以定义一个定义集合元素的关联类型.
那么让我们说我想要一个协议来定义一个Stack,但是堆栈是什么?没关系,我只是使用相关类型作为占位符.
protocol Stack
{
// typealias Element - Swift 1
associatedtype Element // Swift 2+
func push(x: Element)
func pop() -> Element?
}
Run Code Online (Sandbox Code Playgroud)
在上面Element是堆栈中任何对象的类型.当我实现堆栈时,我typealias用来指定堆栈元素的具体类型.
class StackOfInt: Stack
{
typealias Element = Int // Not strictly necessary, can be inferred
var ints: [Int] = []
func push(x: Int)
{
ints.append(x)
}
func pop() -> Int?
{
var ret: Int?
if ints.count > 0
{
ret = ints.last
ints.removeLast()
}
return ret
}
}
Run Code Online (Sandbox Code Playgroud)
在上面,我定义了一个实现的类,Stack并说,对于这个类,Element实际上是Int.但是,人们常常忽略了typealias因为具体类型Element可以从方法实现中推断出来.例如,编译器可以查看在这种情况下push()参数类型的实现和实现Element == Int.
关联类型为用作协议一部分的类型提供占位符名称。在采用该协议之前,不会指定用于该关联类型的实际类型。
\n采用协议的类将决定占位符名称的类型(例如:MyType)
\n例子:
\n protocol MyProAssociate {\n associatedtype MyType\n func sumOf(x: MyType, y: MyType) -> MyType\n }\n\n class MyCls1: MyProAssociate {\n\n typealias MyType = Int\n func sumOf(x: Int, y: Int) -> Int {\n return x + y\n }\n }\n\nclass MyCls2: MyProAssociate {\n\n typealias MyType = Float\n func sumOf(x: Float, y: Float) -> Float {\n return x + y\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |