将 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
示例。
我只是想确定我没有遗漏一些非常简单的解决方案...
如果您为 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
示例。