将NSTableView列标识符映射到ivars的简便方法?

时间:2015-12-16 20:04:52

标签: swift nstableview

我只是想确定我没有错过一些令人眼花缭乱的简单解决方案......

如果您为tableView的数据源使用字典数组,则可以轻松地检索任何值... ...

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

我已将数据实现为struct的数组,其中包含大量的ivars。因此,为了获得数据,我有一个带有50(并且正在增长)行的switch语句,这很难维护。

使用某种类型的objectForKey会更简单,它会将字符串映射到ivar并返回值。这是通常用反射做的事情,但我不认为斯威夫特有那个(还)吗?

所有人都有一个很好的解决方案吗?我在SO周围看到了一些提及,但没有具体的内容。

1 个答案:

答案 0 :(得分:1)

如果你的类继承自NSObject(因此参与ObjC运行时),你可以使用Key-Value Coding查找属性值 - 一种不是特定于Swift但可供所有人使用的反射/内省形式可可物。

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示例。