使用 `ReferenceWritableKeyPath ` 的 Swift 编译器段错误

标签 swift observable swift4

使用 ReferenceWritaleKeyPath 读取属性导致编译器段错误。

我正在设置一个助手来简化两个变量的绑定(bind)。用help from OOPer我的基本绑定(bind)可以正常工作,但是如果如下所示修改代码以在执行绑定(bind)之前检查值是否不同,则会出现段错误。

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 提交错误报告如果你有时间。

关于使用 `ReferenceWritableKeyPath ` 的 Swift 编译器段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44917650/

相关文章:

swift - 如何使用 ObjectMapper 映射子类

objective-c - 将 Swift 协议(protocol)传递给 Objective-C 指针

angular - RxJS 使用异步管道成功处理

ios - Codable/Decodable 不解码

ios - 如何快速从一系列键值对(元组)创建两个字符串数组

Swift:致命异常:NSInvalidArgumentException -[__NSCFSet getObjects:andKeys:]:无法识别的选择器发送到实例 0x1375886c0

swift - 在 NavigationController 中添加右键按钮

Angular 4 从订阅返回数据

javascript - 如何在 Angular 8 中用 Material 显示可观察的过滤项目?

ios - UITextField - 返回时向下滚动