Cocoa绑定到swift中的可选属性

时间:2016-11-14 22:34:17

标签: swift optional cocoa-bindings

如何为可选数据类型的属性设置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绑定到Array Controller(Controller Key = arrangedObjects) 然后单个TableViewCells绑定到表格单元格视图的各种属性(模型关键路径= objectValue.distance等)

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

1 个答案:

答案 0 :(得分:0)

你不能,至少不能直接。

Cocoa Bindings通过Objective-C运行时工作,而ObjC无法表示不属于对象的Swift Optionals(aka class aka reference)类型。 (也就是说,您可以从ObjC访问NSWindow?,甚至可以访问AnyObject?,但不能访问Int?CGRect?TimeInterval?。< / p>

你最好的选择可能是回到以ObjC的方式做事 - 让ETA成为非可选的TimeInterval,并使用一些哨兵价值(负面的东西 - 巨大吗?)表示未设置ETA的情况。您可以使用值变换器来确保在UI中正确表示此类情况。

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