【发布时间】:2015-10-29 10:34:34
【问题描述】:
问题是我有一些结构或类具有符合某些协议的通用约束。当我尝试根据泛型类型 T 添加专门的实现时,它适用于类但不适用于结构。我不能在我的特定用例中使用类,因为这个类应该符合需要初始化器的协议,但我不能在扩展中指定类初始化器。
有什么办法让它工作吗?还是我应该选择另一条路?这是一个演示问题的代码sn-p。
protocol ProtocolA {}
protocol ProtocolB: ProtocolA {}
protocol ProtocolC {
fun act()
}
struct StructA: ProtocolA {}
struct StructB: ProtocolB {}
struct StructC<T: ProtocolA>: ProtocolC {}
extension StructC {
func act() {
print("general")
}
}
extension StructC where T: ProtocolB {
func act() {
print("special")
}
}
class ClassC<T: ProtocolA>: ProtocolC {
}
extension ClassC {
func act() {
print("general")
}
}
extension ClassC where T: ProtocolB {
func act() {
print("special")
}
}
let classCA = ClassC<StructA>()
let classCB = ClassC<StructB>()
//this works
classCA.act() //-> "general"
classCB.act() //-> "special"
let structCA = StructC<StructA>()
let structCB = StructC<StructB>()
//Does not even compile
structCA.act()
structCB.act() // error: "Ambigous use of 'act()'"
UPD:如果我使用带有别名类型的协议并扩展协议而不是结构,那么它可以工作:
protocol ProtocolD {
typealias V
func act()
}
struct StructD<T: ProtocolA>: ProtocolD {
typealias V = T
}
extension ProtocolD {
func act() {
print("general")
}
}
extension ProtocolD where V: ProtocolB {
func act() {
print("special")
}
}
let structDA = StructD<StructA>()
let structDB = StructD<StructB>()
//works again
structDA.act() //-> "general"
structDB.act() //-> "special"
但它仍然没有解决或解释类和结构不同行为的问题。
UPD:该问题的归档雷达 rdar://23314307
【问题讨论】:
标签: swift