难以理解复杂的快速相关类型声明

时间:2017-04-05 04:10:23

标签: swift generics types protocols

我在swift github repository

看到了以下代码行
associatedtype Indices : _RandomAccessIndexable, BidirectionalCollection
    = DefaultRandomAccessIndices<Self>

我知道associatedtype是协议的类型别名,我知道如何在简单的情况下解释它

但有人可以向我解释一下我从swift github存储库看到的代码行吗?

1 个答案:

答案 0 :(得分:1)

这意味着关联的类型Indices必须符合 _RandomAccessIndexableBidirectionalCollection,默认情况下为DefaultRandomAccessIndices<Self>,除非另有声明(或推断)(其中Self是采用该协议的实际类型)。

示例:

struct MyIndex : Comparable {
    var value : Int16

    static func ==(lhs : MyIndex, rhs : MyIndex) -> Bool {
        return lhs.value == rhs.value
    }
    static func <(lhs : MyIndex, rhs : MyIndex) -> Bool {
        return lhs.value < rhs.value
    }
}

struct MyCollectionType : RandomAccessCollection {

    var startIndex : MyIndex { return MyIndex(value: 0) }
    var endIndex : MyIndex { return MyIndex(value: 3) }

    subscript(position : MyIndex) -> String {
        return "I am element #\(position.value)"
    }

    func index(after i: MyIndex) -> MyIndex {
        guard i != endIndex else { fatalError("Cannot increment endIndex") }
        return MyIndex(value: i.value + 1)
    }
    func index(before i: MyIndex) -> MyIndex {
        guard i != startIndex else { fatalError("Cannot decrement startIndex") }
        return MyIndex(value: i.value - 1)
    }
}

let coll = MyCollectionType()
let i = coll.indices
print(type(of: i)) // DefaultRandomAccessIndices<MyCollectionType>

MyCollectionType是一个(最小?)的实现 RandomAccessCollection,使用自定义索引类型MyIndex。 它没有定义自己的indices方法或Indices类型, 以便Indices成为默认关联类型, 和 indices  是RandomAccessCollection的默认协议扩展方法。