通过Swift使用键值编程(KVP)

通过Swift使用键值编程(KVP),swift,Swift,在Objective-C和Cocoa中,通过使用键值编程(KVP),许多任务可以在没有显式循环的情况下完成。例如,我可以用一行代码找到数组中的最大数: NSNumber * max = [numbers valueForKeyPath:@"@max.intValue"]; 我怎样才能对斯威夫特做同样的事情?数组似乎不支持valueForKeyPath方法。我不确定KVP,但Swift当前不支持KVO。另请参阅此开发人员论坛线程: 您仍然可以(至少)使用Swift on properties提供

在Objective-C和Cocoa中,通过使用键值编程(KVP),许多任务可以在没有显式循环的情况下完成。例如,我可以用一行代码找到数组中的最大数:

NSNumber * max = [numbers valueForKeyPath:@"@max.intValue"];

我怎样才能对斯威夫特做同样的事情?数组似乎不支持valueForKeyPath方法。

我不确定KVP,但Swift当前不支持KVO。另请参阅此开发人员论坛线程:


您仍然可以(至少)使用Swift on properties提供的
didSet
willSet
。我想总比什么都没有好

数组实际上会响应valueForKeyPath函数-您只需将数组强制转换为
AnyObject
,这样编译器就不会抱怨了。详情如下:

var max = (numbers as AnyObject).valueForKeyPath("@max.self") as Double
甚至,对于对象的并集:

(labels as AnyObject).valueForKeyPath("@unionOfObjects.text")
如果上面的
标签
是标签的集合,则上面的标签将返回每个标签的
文本
属性的所有字符串的数组

它也相当于以下内容:

(labels as AnyObject).valueForKey("text")

。。。正如在Objective-C:)

中一样,您也可以使用数组的reduce函数

let numbers = [505,4,33,12,506,21,1,0,88]
let biggest = numbers.reduce(Int.min,{max($0, $1)})
println(biggest) // prints 506
很好的解释