我正在使用NSArray的indicesOfObjects(passingTest :),但在我将代码转换为
Swift 3之后,我得到错误:“不明确地使用’indexOfObject(passingTest :)’”.
我的代码在Swift 2.3下运行良好.
我的代码在Swift 2.3下运行良好.
let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(passingTest: { (constraint,idx,stop) in if let view = constraint.firstItem as? UIView{ return view.tag == usernaMetag } else{ return false } })
对于Swift 3,我还必须将约束强制转换为AnyObject,但这并不能解决实际问题.
我最终使用func indicesOfObjects(options:NSEnumerationOptions = [],passingTest:(Any,Int,UnsafeMutablePointer< ObjCBool>) – > Bool),其中包含一个空数组,如下所示.这有效,但我仍然不明白为什么我的原始实现会出现“不明确…”错误.
let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(options: [],passingTest: { (constraint,stop) in if let view = (constraint as AnyObject).firstItem as? UIView{ return view.tag == usernaMetag } else{ return false } })
解决方法
在Objective-C中,两个索引的方法有两种不同的方法:
- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj,NSUInteger idx,BOOL *stop))predicate NS_AVAILABLE(10_6,4_0); - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj,4_0);
而现在,Swift 3将这些导入为模糊的两种方法:
@available(iOS 4.0,*) open func indexesOfObjects(passingTest predicate: (Any,UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet @available(iOS 4.0,*) open func indexesOfObjects(options opts: NSEnumerationOptions = [],passingTest predicate: (Any,UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet
一个是indicesOfObjects(passingTest :),另一个是indicesOfObjects(options:passingTest :).不幸的是,Swift 3给出了参数选项的默认值,这使得像bubbleConstraints.indexesOfObjects(passingTest:…)这样的简单调用变得模棱两可.
它可能在呼唤
> indicesOfObjects(passingTest