在Swift 3转换之后,我无法摆脱错误:"不明确地使用'indexOfObject(passingTest :)'"

Ste*_*han 6 compiler-errors ambiguous ios swift3 ios10

我正在使用NSArray的是indexOfObjects(passingTest :),但是在我将代码转换为Swift 3之后,我得到了错误:"不明确地使用'indexOfObject(passingTest :)'".我的代码在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
        }
    })
Run Code Online (Sandbox Code Playgroud)

对于斯威夫特3,我也不得不投constraintAnyObject,但这并不解决实际问题.

我最终使用func indexesOfObjects(options: NSEnumerationOptions = [], passingTest: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool)了一个空数组来获取选项,如下所示.这有效,但我仍然不明白为什么我的原始实现会出现"不明确..."错误.

let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(options: [], passingTest: { (constraint, idx, stop) in
        if let view = (constraint as AnyObject).firstItem as? UIView{
            return view.tag == usernameTag
        }
        else{
            return false
        }
    })
Run Code Online (Sandbox Code Playgroud)

OOP*_*Per 13

在Objective-C中,这两种indexesOf方法有两种不同的方法:

- (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, NSUInteger idx, BOOL *stop))predicate NS_AVAILABLE(10_6, 4_0);
Run Code Online (Sandbox Code Playgroud)

而现在,Swift 3将这些导入为模糊的两种方法:

@available(iOS 4.0, *)
open func indexesOfObjects(passingTest predicate: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet

@available(iOS 4.0, *)
open func indexesOfObjects(options opts: NSEnumerationOptions = [], passingTest predicate: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) -> IndexSet
Run Code Online (Sandbox Code Playgroud)

一个是indexesOfObjects(passingTest:),另一个是indexesOfObjects(options:passingTest:).不幸的是,Swift 3给出了参数的默认值options,这使得一个简单的调用变得bubbleConstraints.indexesOfObjects(passingTest: ...)模糊不清.

它可能在呼唤

  • indexesOfObjects(passingTest:)

要么

  • indexesOfObjects(options:passingTest:) 给出默认值 options

(Swift不应该给出默认值,如果它导致这种歧义.更好地发送错误报告.)

在这种情况下,您的解决方法代码,使用indexesOfObjects(options:passingTest:)应该工作,但还有另一种解决方法:

bubbleConstraints.indexesOfObjects(passingTest:) {constraint, idx, stop in
    //...
}
Run Code Online (Sandbox Code Playgroud)

方法引用.indexesOfObjects(passingTest:)将方法indexesOfObjects(passingTest:)作为闭包返回,上面的表达式调用它.


顺便说一句,你最好考虑使用Swift的集合方法,而不是使用NSArrays方法:

let indexesOfBubbleConstraints = bubbleConstraints.enumerated().lazy
    .filter {(idx, constraint) in
        //...
    }.map{$0.offset}
Run Code Online (Sandbox Code Playgroud)