2016-09-19 16 views
5

Tôi đang sử dụng chỉ số NSArray 's indexesOfObjects (passingTest :), nhưng sau khi tôi chuyển đổi mã của mình thành Swift 3 Tôi nhận được lỗi: "Sử dụng không rõ ràng 'indexOfObject (passingTest :)'". Mã của tôi dưới đây hoạt động tốt với Swift 2.3.Sau khi chuyển đổi Swift 3, tôi không thể loại bỏ lỗi: "Sử dụng không rõ ràng '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 
     } 
    }) 

Đối Swift 3, tôi cũng đã phải đúc constraint-AnyObject, nhưng điều đó không giải quyết vấn đề thực tế.

Tôi đã kết thúc bằng cách sử dụng func indexesOfObjects(options: NSEnumerationOptions = [], passingTest: (Any, Int, UnsafeMutablePointer<ObjCBool>) -> Bool) với một mảng trống cho các tùy chọn như bên dưới. Điều này làm việc, nhưng tôi vẫn không hiểu tại sao tôi nhận được lỗi "mơ hồ ..." với triển khai ban đầu của mình.

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 
     } 
    }) 

Trả lời

12

Trong Objective-C, hai indexesOf phương pháp riêng biệt hai phương pháp:

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

Và bây giờ, Swift 3 nhập khẩu những người như mơ hồ hai phương pháp:

@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 

Một là indexesOfObjects(passingTest:) và một loại khác là indexesOfObjects(options:passingTest:). Và thật không may, Swift 3 đã đưa ra một giá trị mặc định cho tham số options, đã thực hiện một cuộc gọi đơn giản như bubbleConstraints.indexesOfObjects(passingTest: ...) không rõ ràng.

Nó có thể được gọi

  • indexesOfObjects(passingTest:)

hoặc

  • indexesOfObjects(options:passingTest:) với cho giá trị mặc định để options

(Swift không nên cung cấp một giá trị mặc định, nếu nó gây ra loại sự mơ hồ này. . Better gửi báo cáo lỗi)

Trong trường hợp này, mã workaround của bạn, sử dụng indexesOfObjects(options:passingTest:) nên làm việc, nhưng có một việc xung quanh:

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

Phương pháp tham khảo .indexesOfObjects(passingTest:) trả về phương pháp indexesOfObjects(passingTest:) như một đóng cửa, và biểu thức trên đang gọi nó.


Bằng cách này, bạn tốt hơn xem xét sử dụng phương pháp thu thập Swift, hơn là sử dụng phương pháp một NSArray s:

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

Great câu trả lời chi tiết! Tôi cũng đánh giá cao nhận xét cuối cùng của bạn và chắc chắn sẽ làm như bạn đề xuất. – Stephan

Các vấn đề liên quan