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 提交错误报告。