如何使用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 */ } 

希望这可以帮助。