Swift Xcode 7 beta 5类型不能将自身称为要求

时间:2015-08-07 03:54:32

标签: swift generics protocols

此代码过去是合法的:

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。我一直都能做到这一点。为什么突然之间做错了?

1 个答案:

答案 0 :(得分:1)

我不知道为什么这应该是错的。但解决它是相当容易的(虽然讨厌):为Flier声明另一个协议,并将其用作约束类型:

protocol Superflier {}
protocol Flier : Superflier {
    typealias Other : Superflier
    func flockTogetherWith(f:Other)
}

它使代码真的受到折磨,但至少它会通过编译器。

编辑:来自SevenTenEleven的开发论坛的回复:

  

拥有这种约束本身并不合理,但在某些情况下会导致编译器崩溃。我们决定现在就锁定这个。您使用第二个协议的解决方法是合理的。

因此,如果令人遗憾的话,这种改变可能被认为是故意的,我给出的解决方法是现在的方法。