将NSTableView列标识符映射到ivar的简单方法



我只想确保我没有错过一些简单的解决方案。。。

如果您使用字典数组作为tableView的数据源,您可以很容易地检索到任何值,其中包含。。。

func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {
    return myData().objectAtIndex(row).objectForKey(tableColumn!.identifier)
}

我已经将我的数据实现为具有大量ivar的struct数组。因此,为了获得数据,我有一个包含50行(并且还在增长)的switch语句,这是一个很难维护的问题。

使用某种类似的objectForKey会简单得多,它会将字符串映射到ivar并返回值。这是人们通常会反思的事情,但我认为斯威夫特(还)没有?

那么,有人有一个好的解决方案吗?我看到一些关于SO的提及,但没有具体的内容。

如果您的类继承自NSObject(因此参与了ObjC运行时),则可以使用键值编码查找属性值,这是一种反射/内省形式,并非Swift特有,但可用于所有Cocoa对象。

class MyClass: NSObject {
    var foo: String = "text"
    var bar: Int = 3
    var baz = ["zap" : 42]
}
let thing = MyClass()
let a = thing.valueForKey("foo") // "text"
let b = thing.valueForKey("bar") // 3
let c = thing.valueForKeyPath("baz.zap") // 42

valueForKey(_:)方法按名称查找属性,遍历它们的访问器,并在运行时返回一个封装在任何合适的Cocoa类中的值(如果有的话)。(例如,a的静态类型是Optional<AnyObject>,在运行时,可以安全地展开和强制转换为的类型与NSString有关。)

KVC做了很多很酷的事情——其中一些Swift有更类型安全的等价物(map等人),还有一些仍然是独一无二的。例如,valueForKeyPath(_:)采用一个点分隔的键列表,该列表递归地查找值中的值——就像上面的baz.zap示例一样。

最新更新