如何使用indexOfObjectsPassingTest:在Swift中
indexOfObjectsPassingTest的声明:在Swift中看起来像这样,
func indexesOfObjectsPassingTest(predicate: ((AnyObject!, Int, CMutablePointer<ObjCBool>) -> Bool)!) -> NSIndexSet!
我已经尝试了各种排列组合,但是我很难,特别是如何处理这件作品, CMutablePointer<ObjCBool>) -> Bool)!
。 我发现它足够让人困惑,当我第一次学习Objective-C中的块时,如何从声明转换到实际使用的方法,而Swift的语法至less是令人困惑的。
这段代码在我的游乐场工作;)希望它有一点帮助
额外的function定义
import Cocoa let list = [2, 3, 4, 5, 6, 7, 8] func test (object: AnyObject!, index: Int, stop: CMutablePointer<ObjCBool>) -> Bool { let number = object as Int return (number % 2 == 0) //for even numbers } let result: NSIndexSet = (list as NSArray).indexesOfObjectsPassingTest(test) println("\(result.lastIndex)") //prints "6" (because 8%2=0)
直列closures
我把上面的例子转换成了一个内联闭包(在Swift-eBook中描述)。 参数列表和返回types由术语in
分隔。
import Cocoa let list = [2, 3, 4, 5, 6, 7, 8] let result: NSIndexSet = (list as NSArray).indexesOfObjectsPassingTest({ (object: AnyObject!, index: Int, stop: CMutablePointer<ObjCBool>) -> Bool in let number = object as Int return (number % 2 == 0) //for even numbers }) println("\(result.lastIndex)") //prints "6" (because 8%2=0)
看起来像CMutablePointer最近更改为UnsafeMutablePointer。
这个为我工作:
let indices = myArray.indexesOfObjectsPassingTest({ (obj: AnyObject!, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Bool in var didPass = false //determine if obj passes test, if it does set didPass = true return didPass })
块语法在Swift中被一个闭包(在这里是predicate
参数)replace。
所以你可以做:
var array = NSArray(array: [1, 2, 3, 4, 5]) var indexSet = array.indexesOfObjectsPassingTest({ (val: AnyObject!, index: Int, stop: CMutablePointer<ObjCBool>) -> Bool in return index > 2 }) indexSet.count
从方法中,它可能看起来像这样:
var closure = {(val: AnyObject!, index: Int, stop: CMutablePointer<ObjCBool>) -> Bool? in /* Do Something */ }
希望这可以帮助。