如何为可选数据类型的属性设置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
是可选的。处理这个问题的正确方法是什么?谢谢
答案 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中使用,并公开第二个非可选类型的计算属性以用于绑定。