gpt4 book ai didi

ios - Swift 3 转换后,我无法摆脱错误 : "Ambiguous use of ' indexOfObject(passingTest: )'"

转载 作者:可可西里 更新时间:2023-11-01 03:38:28 24 4
gpt4 key购买 nike

我正在使用 NSArray的 indexesOfObjects(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
}
})

对于 Swift 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
}
})

最佳答案

在 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);

现在,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

一个是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
//...
}

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


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

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

关于ios - Swift 3 转换后,我无法摆脱错误 : "Ambiguous use of ' indexOfObject(passingTest: )'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39569250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com