Swift 使用“ReferenceWritableKeyPath”的编译器分段错误
Swift compiler segmentation fault using `ReferenceWritableKeyPath `
使用 ReferenceWritaleKeyPath
读取 属性 导致编译器分段错误。
我正在设置一个助手来简化两个变量的绑定。使用 我得到了基本的绑定工作,但是如果如下所示修改代码以在执行绑定之前检查值是否不同,它会出现分段错误。
protocol Bindable: class {
var observers: [NSKeyValueObservation] {get set}
}
extension Bindable {
func bind<Value>(to targetKeyPath: ReferenceWritableKeyPath<Self, Value>, from sourceKeyPath: KeyPath<Self, Value>)
where Self: NSObject {
self.observers.append( self.observe(sourceKeyPath, options: [.initial, .new]) {object, change in
// FAILS: compiler failed due to signal: Segmentation fault: 11
if( self[keyPath:targetKeyPath] != change.newValue ) {
self[keyPath: targetKeyPath] = change.newValue!
}
})
}
}
问题是您尝试将 !=
与通用类型 Value
一起使用,它不一定具有 ==
和 !=
实现。将 <Value>
替换为 <Value: Equatable>
即可解决。
话虽如此,无论您的代码是否正确,因分段错误而崩溃的编译器始终是一个错误。如果有时间,您应该考虑在 https://bugs.swift.org 提交错误报告。
使用 ReferenceWritaleKeyPath
读取 属性 导致编译器分段错误。
我正在设置一个助手来简化两个变量的绑定。使用
protocol Bindable: class {
var observers: [NSKeyValueObservation] {get set}
}
extension Bindable {
func bind<Value>(to targetKeyPath: ReferenceWritableKeyPath<Self, Value>, from sourceKeyPath: KeyPath<Self, Value>)
where Self: NSObject {
self.observers.append( self.observe(sourceKeyPath, options: [.initial, .new]) {object, change in
// FAILS: compiler failed due to signal: Segmentation fault: 11
if( self[keyPath:targetKeyPath] != change.newValue ) {
self[keyPath: targetKeyPath] = change.newValue!
}
})
}
}
问题是您尝试将 !=
与通用类型 Value
一起使用,它不一定具有 ==
和 !=
实现。将 <Value>
替换为 <Value: Equatable>
即可解决。
话虽如此,无论您的代码是否正确,因分段错误而崩溃的编译器始终是一个错误。如果有时间,您应该考虑在 https://bugs.swift.org 提交错误报告。