请考虑以下几点:
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> {}我知道在黑暗中这是一个很长的机会,但有人经历过吗?
如果是的话,你找到什么解决办法了吗?
增编:如果迅速地允许在 protocol本身中表示相等约束,而不是将约束泄漏到它的实现者中,这是完全可以避免的。请参阅this question。
发布于 2015-12-02 07:12:11
好吧。因此,经过几次强力调试之后,我发现如果我对受约束的参数使用相同的type名称,它就会编译。
例如,
protocol Foo {
typealias FooBar
typealias FooBaz
typealias Data
}
final class FooClass<F: Foo where F.Data == F.FooBar.Data, F.Data == F.FooBaz.Data> {}这个将编译。请注意,我所做的只是将Schema更改为Data。这绝对是个窃听器。
-EDIT:并相应地报告。
https://stackoverflow.com/questions/34036240
复制相似问题