2016-09-19 88 views
5

我使用NSArray的indexesOfObjects(passingTest :),但是在將我的代碼轉換爲Swift 3我得到錯誤:「模糊使用'indexOfObject(passingTest :)'」。 我的代碼在Swift 2.3中可以正常工作。經過Swift 3轉換後,我無法擺脫錯誤:「模糊使用'indexOfObject(passingTest :)'」

let indexesOfBubbleConstraints = bubbleConstraints.indexesOfObjects(passingTest: { (constraint, idx, stop) in 
     if let view = constraint.firstItem as? UIView{ 
      return view.tag == usernameTag 
     } 
     else{ 
      return false 
     } 
    }) 

對於斯威夫特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 
     } 
    }) 

回答

12

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

現在,夫特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

(斯威夫特不應該給一個默認值,如果它導致這種歧義。 。更好的發送錯誤報告)

在這種情況下,你的解決方法的代碼,使用indexesOfObjects(options:passingTest:)應該工作,但還有另一種解決辦法:

bubbleConstraints.indexesOfObjects(passingTest:) {constraint, idx, stop in 
    //... 
} 

方法參考.indexesOfObjects(passingTest:)返回方法indexesOfObjects(passingTest:)爲關閉,並且上面的表達式正在調用它。


順便說一句,你最好考慮使用雨燕的收集方法,而不是使用NSArray S分析:

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

大詳細的解答!我也很感謝你最後的評論,並且一定會按照你的建議去做。 – Stephan