Swift中的关联类型

时间:2016-01-28 15:11:47

标签: swift swift2

swift编程语言中有哪些相关类型?它们用于什么?

根据swift编程语言书:

  

在定义协议时,有时很有用来声明一个或   更多相关类型作为协议定义的一部分。一个   关联类型为类型提供占位符名称(或别名)   用作协议的一部分。要使用的实际类型   在采用协议之前,不指定关联类型。   使用typealias关键字指定关联类型。

以上文字对我来说不是很清楚。如果你能用一个例子解释相关类型,那将会有很大帮助。

另外,为什么将关联类型声明为协议定义的一部分是有用的?

1 个答案:

答案 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的参数类型中实现。