类似这样的东西:
protocol MyCollection {
var collection:Collection where Collection.Element == Int { get }
}
我希望“ MyCollection”类型公开Ints集合,而集合的实际类型是私有的。收集属性中只有“收集”协议中的方法可用。
答案 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集合,而集合的实际类型是私有的
您不能。您不能将通用协议用作类型(例如,用作变量或参数的声明类型)。普通而简单的通用协议不是一种类型。
唯一可以使用通用协议的地方就是限制。