Swift 利用协变类型的性质满足协议要求
我有一个协议,它有一个属性要求:Swift 利用协变类型的性质满足协议要求,swift,Swift,我有一个协议,它有一个属性要求: protocol V {} protocol P { var v: V? { get } } 问题是只有V类型的属性才能满足此要求。编译以下代码: class A: P { var v: V? } 但以下情况并非如此: protocol Some: V {} class B: P { var v: Some? } protocol Another {} class C: P { var v: (Another & V)? }
protocol V {}
protocol P {
var v: V? { get }
}
问题是只有V
类型的属性才能满足此要求。编译以下代码:
class A: P {
var v: V?
}
但以下情况并非如此:
protocol Some: V {}
class B: P {
var v: Some?
}
protocol Another {}
class C: P {
var v: (Another & V)?
}
也就是说,协变或协议组合类型都不能满足协议要求。这似乎是编译器的一个非常古老(而且非常不幸)的限制(请参阅)
问题:此限制是否有解决办法
另一个问题:Swift issue tracker上有几个副本和相关问题,但没有一个与此完全匹配。发布这个问题有什么意义吗 问题:此限制是否有解决办法 您可以使用
p
中的associatedtype
(符合V
)作为p
中V
的类型注释,并将此associatedtype
用作符合p
的类型的通用类型保持器
protocol V {}
protocol P {
associatedtype T: V
var v: T? { get }
}
/* typeholder conformance via protocol inheritance */
protocol Some: V {}
class B<T: Some>: P {
var v: T?
}
/* ... protocol composition */
protocol Another {}
class C<T: Another & V>: P {
var v: T?
}
协议V{}
P方案{
关联类型T:V
var v:T?{get}
}
/*通过协议继承实现typeholder一致性*/
协议部分:V{}
B类:P{
var v:T?
}
/* ... 协议组成*/
协议另一{}
丙级:P{
var v:T?
}
上面C
中v
的类型注释是否应该是(另一个&v)?
而不是(另一个&P)?
?@dfri是的,你是对的,它应该是。