此代码过去是合法的:
protocol Flier {
typealias Other : Flier
func flockTogetherWith(f:Other)
}
struct Bird : Flier {
func flockTogetherWith(f:Insect) {}
}
struct Insect : Flier {
func flockTogetherWith(f:Insect) {}
}
现在(在Xcode 7 beta 5中)它不是。这里发生了什么?这是一个错误吗?我只是想确保Flier的采用者使用Flier的一些参数声明flockTogetherWith
。我一直都能做到这一点。为什么突然之间做错了?
答案 0 :(得分:1)
我不知道为什么这应该是错的。但解决它是相当容易的(虽然讨厌):为Flier声明另一个协议,并将其用作约束类型:
protocol Superflier {}
protocol Flier : Superflier {
typealias Other : Superflier
func flockTogetherWith(f:Other)
}
它使代码真的受到折磨,但至少它会通过编译器。
编辑:来自SevenTenEleven的开发论坛的回复:
拥有这种约束本身并不合理,但在某些情况下会导致编译器崩溃。我们决定现在就锁定这个。您使用第二个协议的解决方法是合理的。
因此,如果令人遗憾的话,这种改变可能被认为是故意的,我给出的解决方法是现在的方法。