【发布时间】:2015-12-02 19:54:33
【问题描述】:
考虑以下几点:
protocol DataContainer {
typealias Data
}
protocol Foo {
typealias FooBar: DataContainer
typealias FooBaz: DataContainer
typealias Schema
}
final class FooClass<F: Foo where F.Schema == F.FooBar.Data, F.Schema == F.FooBaz.Data> {}
这个相当富有表现力的 where 子句无法编译并带有神秘的错误消息:
由于信号导致命令失败:中止陷阱 6
...
swift(4946,0x7fff777c9300) malloc: *** 对象 0x7fff5a5fbfe0 错误:未分配指针被释放
对我来说,这完全没有意义。我已经确认,当我像这样删除 where 子句约束时,错误消失了:
final class FooClass<F: Foo> {}
我知道这是在黑暗中的远景,但有人经历过吗?
如果是这样,您找到了什么解决方法?
附录:如果 swift 允许在protocol 本身内部 表达等式约束,而不是将约束泄漏到其实现者中,则可以完全避免这种情况。参考this question。
【问题讨论】:
-
那个“神秘的错误信息”在我看来更像是 Swift 编译器崩溃。如果是这样,您应该创建一个最小的示例,并在 bugreport.apple.com 上向 Apple 报告。对于它的价值,我得到了一个不同的错误
'Data' is not a member type of 'F.FooBar',这更有意义。 (Xcode 7.1.1) -
@JeremyP 我知道这是编译器崩溃。仅凭它的信息就很明显,没有指出。我所说的 cryptic 的意思是它与手头的代码无关。而且我已经报了。谢谢。
-
从您的问题文本中,您意识到自己手上的编译器崩溃并不明显。顺便说一句,我并没有批评你的问题或建议你不应该因此而问这个问题,我只是想确保苹果公司意识到这个问题,以便可以修复它。不管你的代码有没有错,如果它使编译器崩溃,那就是编译器的一个错误。
-
@JeremyP 对于反应过度我深表歉意。最近我对 swift 的编译器问题很少感到沮丧。希望你有一个美好的一天!
-
自从第一个测试版发布以来,我一直在使用 Swift,所以我完全理解您的沮丧。仍然有太多编译器崩溃,通常需要一段时间才能找到导致它们的行。