Cocoa 绑定到 swift 中的可选 属性

Cocoa Binding to an optional property in swift

如何为可选数据类型的属性设置 cocoa 绑定?

我有一个 NSTableView,它通过键绑定显示来自 NSArrayController 的数据,它反过来管理 [Properties] 数组的对象,这些对象定义为:

    class Property: NSObject {
        var distance: CLLocationDistance    
        var ETA: TimeInterval?                
        var coordinates: CLLocationCoordinate2D
        // other properties and methods here
    }

在我定义的MainViewController中

    var properties: [Property] = []
    @IBOutlet var arrayController: NSArrayController!

其中 arrayController 绑定到 properties 数组, NSTableView 绑定到阵列控制器(控制器密钥 = arrangedObjects) 然后个人 TableViewCells 绑定到 Table Cell View 的各种属性(模型关键路径 = objectValue.distance,等等)

代码编译没有任何问题,但在运行时它在尝试加载 table 时崩溃。问题在于 ETA 列,因为 properties.ETA 是可选的。处理这个问题的正确方法是什么?谢谢

你不能,至少不能直接。

Cocoa 绑定在 Objective-C 运行时工作,ObjC 无法表示 Swift 非对象的可选(又名 class 又名参考)类型。 (也就是说,您可以从 ObjC 访问 NSWindow?,甚至 AnyObject?,但不能访问 Int?CGRect?TimeInterval?。)

你最好的选择可能是回到你在 ObjC 中做事的方式——使 ETA 成为一个非可选的 TimeInterval,并使用一些标记值(负值-巨大的?) 表示未设置 ETA 的情况。您可以使用值转换器来确保此类情况在您的 UI.

中得到适当表示

或者,您可以保留可选的 属性 用于 Swift,并公开第二个非可选类型的计算 属性 用于绑定。