【发布时间】:2017-04-05 06:30:35
【问题描述】:
我想知道我在这段代码中是否遗漏了一些简单的东西,或者它只是 Swift 诡计的混合,阻止了我做我想做的事。
我允许实现Foo 协议的类型包含任何类型的entity 属性,只要它符合StringIdentifiable:
protocol StringIdentifiable {
var id: String? { get }
}
protocol Foo: class {
associatedtype AnyStringIdentifiable: StringIdentifiable
var entity: AnyStringIdentifiable? { get set }
}
从 Swift 3.1 开始,如果不使用 associatedtype,则此“任何类型”部分 wouldn't be possible。继续,假设我有另一个需要Foo 属性的协议。但是,Foo 是通用的,所以您可能知道我们不能这样做,因为 “通用协议只能用作通用约束”。为了避免类型擦除混乱,我决定在我的第二个协议中使用另一个 associatedtype 并且编译器不会抱怨:
protocol Bar {
//var foo: Foo { get set } // can't do because Foo is generic
associatedtype AnyFoo: Foo
var foo: AnyFoo { get set }
}
但是现在,如果我尝试在foo 中设置某些内容,编译器会报错:
extension Bar {
func setEntity(_ entity: StringIdentifiable) {
foo.entity = entity
}
}
错误是无法将类型“StringIdentifiable”的值分配给类型“_?”
注意:这个问题的代码可以在操场上测试。
【问题讨论】: