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,我也不得不投constraint来AnyObject,但这并不解决实际问题.
我最终使用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)
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |