我只想确保我没有错过一些简单的解决方案。。。
如果您使用字典数组作为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
示例一样。