在使用Cocoa的Objective-C中,通过使用键值编程(KVP),可以在没有显式循环的情况下完成许多任务。例如,我可以使用一行代码找到数组中的最大数字:
NSNumber * max = [numbers valueForKeyPath:@"@max.intValue"];
我怎么能用swift做同样的事情?数组似乎不支持valueForKeyPath方法。
答案 0 :(得分:22)
数组实际上会响应valueForKeyPath函数 - 你只需要将数组转换为AnyObject
,这样编译器就不会抱怨。如下:
var max = (numbers as AnyObject).valueForKeyPath("@max.self") as Double
甚至是对象联合:
(labels as AnyObject).valueForKeyPath("@unionOfObjects.text")
如果上面的labels
是标签集合,则上面将返回每个标签的text
属性的所有字符串数组。
它也等同于以下内容:
(labels as AnyObject).valueForKey("text")
......就像在Objective-C中一样:)
答案 1 :(得分:2)
您也可以使用Array
的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
好的解释here
答案 2 :(得分:1)
您仍然可以使用(至少)Swift在属性上提供的didSet
willSet
。我想它总比没有好。
答案 3 :(得分:0)
我不确定KVP,但Swift目前不支持KVO。另见这个开发论坛帖子: