我有一个具有属性要求的协议:
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)?
}
但以下情况并非如此:
order_id | pr1 | pr2 | pro3 | pro4 | price
AB5487 | on | on | | on | 120
AB5587 | on | on | on | | 120
也就是说,协变和协议组合类型都不能满足协议要求。这似乎是编译器的一个旧的(并且非常不幸)限制(参见https://bugs.swift.org/browse/SR-55)。
问题:此限制是否有解决方法?
另一个问题:Swift问题跟踪器上有几个重复和相关问题,但它们似乎都没有完全匹配。发布此问题有什么意义吗?
答案 0 :(得分:2)
问题:此限制是否有任何变通方法?
您可以使用associatedtype
中的P
{符合V
)v
作为P
中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?
}
的类型的通用类型持有者。
'" & Lijn & "'