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

Easy way to map NSTableView column identifiers onto ivars?

我只是想确定我没有遗漏一些非常简单的解决方案...

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

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

我已经将我的数据实现为一个 struct 数组,其中包含很多 ivar。因此,为了获取数据,我有一个 switch 语句,其中有 50 行(并且还在不断增加),维护起来很麻烦。

如果有某种类似 objectForKey 的东西会简单得多,它将字符串映射到 ivar 和 return 值上。这是人们通常会用反射做的事情,但我不认为 Swift 有那个(还)?

所以这里有没有人有好的解决方案?我看到一些关于 SO 的提及,但没有具体的内容。

如果您的 class 继承自 NSObject(因此参与 ObjC 运行时间),您可以使用 Key-Value Coding 查找 属性 值— reflection/introspection 的一种形式,并非特定于 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(_:) 方法按名称查找属性,遍历它们的访问器,returns 一个值包装(在 运行 时间)在任何 Cocoa class 是合适的,如果有的话。 (例如,a 的静态类型是 Optional<AnyObject>,而在 运行 时,您可以安全解包和转换的类型与 NSString 相关。)

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