我只是想确定我没有错过一些令人眼花缭乱的简单解决方案......
如果您为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周围看到了一些提及,但没有具体的内容。
答案 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
示例。