在Swift中,我该如何编写一个公开另一个通用协议的协议?

时间:2018-08-18 14:05:06

标签: swift

类似这样的东西:

protocol MyCollection {
    var collection:Collection where Collection.Element == Int { get }
}

我希望“ MyCollection”类型公开Ints集合,而集合的实际类型是私有的。收集属性中只有“收集”协议中的方法可用。

2 个答案:

答案 0 :(得分:1)

SE-0142: Permit where clauses to constrain associated types开始,您可以对协议中的associatedtype进行蓝图设计并对其施加约束,然后对collection变量进行蓝图以声明为受约束的associatedtype:< / p>

protocol MyCollection {
    associatedtype C : Collection where C.Element == Int
    var collection: C { get }
}

示例:

// OK: C inferred as [Int] which fulfills the constraint on the associated type
struct Foo: MyCollection {
    var collection = [Int]()
}

// error: type 'Bar' does not conform to protocol 'MyCollection'
// note: protocol requires nested type 'C'; do you want to add it?
struct Bar: MyCollection {
    var collection = [Float]()
}

// error: 'MyCollection' requires the types 'Float' and 'Int' be equivalent
// note: requirement specified as 'Self.C.Element' == 'Int' [with Self = Baz]
struct Baz: MyCollection {
    typealias C = [Float]
    var collection: C = []
}

答案 1 :(得分:1)

  

我希望“ MyCollection”类型公开Ints集合,而集合的实际类型是私有的

您不能。您不能将通用协议用作类型(例如,用作变量或参数的声明类型)。普通而简单的通用协议不是一种类型。

唯一可以使用通用协议的地方就是限制。