Swift中的关联类型

Ank*_*oel 8 swift swift2

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.


Tej*_*ina 5

关联类型为用作协议一部分的类型提供占位符名称。在采用该协议之前,不会指定用于该关联类型的实际类型。

\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}\n
Run Code Online (Sandbox Code Playgroud)\n