swift编程语言中有哪些相关类型?它们用于什么?
根据swift编程语言书:
在定义协议时,有时很有用来声明一个或 更多相关类型作为协议定义的一部分。一个 关联类型为类型提供占位符名称(或别名) 用作协议的一部分。要使用的实际类型 在采用协议之前,不指定关联类型。 使用typealias关键字指定关联类型。
以上文字对我来说不是很清楚。如果你能用一个例子解释相关类型,那将会有很大帮助。
另外,为什么将关联类型声明为协议定义的一部分是有用的?
答案 0 :(得分:12)
您有一个协议,用于定义实现类型必须提供的方法和属性。其中一些方法/属性使用或返回不同类型的对象到实现协议的类型。因此,例如,如果您有一个定义某些类型的对象集合的协议,您可以定义一个定义集合元素的关联类型。
所以,让我们说我想要一个协议来定义Stack
,但是堆栈是什么?没关系,我只是使用相关类型作为占位符。
protocol Stack
{
// typealias Element - Swift 1
associatedtype Element // Swift 2+
func push(x: Element)
func pop() -> Element?
}
在上面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
}
}
在上面,我定义了一个实现Stack
的类,并说,对于这个类,Element
实际上是Int
。但是,人们常常忽略typealias
因为Element
的具体类型可以从方法实现中推断出来。例如编译器可以查看push()
的实现,并在这种情况下从Element == Int
的参数类型中实现。