2016-09-10 30 views
6

thay đổi mã sân chơi của tôi để Swift 3, Xcode đề nghị thay đổiLoại 'Lỗi' không phù hợp với giao thức 'RawRepresentable'

enum Error: ErrorType { 
    case NotFound 
} 

để

enum Error: Error { 
    case NotFound 
} 

nhưng bây giờ tôi nhận được lỗi tiêu đề và tôi không biết làm thế nào để có được enum để phù hợp với giao thức đó.

Trả lời

24

Vấn đề là bạn đã đặt tên loại lỗi Error - xung đột với giao thức chuẩn của giao thức Error của thư viện chuẩn (do đó Swift nghĩ bạn có tham chiếu vòng tròn).

Bạn có thể tham khảo các Error giao thức Swift như Swift.Error để disambiguate:

enum Error : Swift.Error { 
    case NotFound 
} 

Nhưng điều này sẽ có nghĩa là bất kỳ tài liệu tham khảo trong tương lai để Error trong module của bạn sẽ tham khảo Error bạn loại, không phải là Giao thức Swift Error (bạn sẽ phải phân định lại).

Do đó, giải pháp đơn giản nhất cho đến nay sẽ đơn giản là đổi tên loại lỗi của bạn thành mô tả cụ thể hơn.

+1

Vì vậy, trong phiên bản cũ, tôi sẽ không thể đặt tên cho ErrorType enum của mình, nhưng bây giờ tên giao thức Swift đã được đổi thành Lỗi, tôi không thể sử dụng Lỗi, phải không? – Shades

+2

@Shades Yup, đó là chính xác - nếu bạn bật "Sử dụng phiên bản ngôn ngữ lập dị Swift" thành "Có" trong cài đặt xây dựng của bạn (sẽ sử dụng Swift 2.3), bạn có thể tự mình thử. – Hamish

2

Lỗi này xảy ra vì bạn đang "ghi đè" tuyên bố hiện tại là Error là . Vì vậy, bạn phải chọn tên khác (có thể mô tả chi tiết hơn) cho "Lỗi" enum của mình.

1

Tôi cũng gặp vấn đề này, mặc dù tôi đã khai báo enum của mình bằng tên cụ thể.

Lý do là tôi đang sử dụng lĩnh vực và nó có lớp học Error, điều này gây nhầm lẫn giữa Swift.ErrorRealmSwift.Error.

Giải pháp là chỉ định RealmSwift.Error trong tuyên bố.

// before 
enum MyError: Error { ... } 
// after 
enum MyError: Swift.Error { ... } 
0

tôi đã cố gắng khối này trong một phiên AVCapture và nó hoạt động trong Swift 3 + iOS 10. Sử dụng một NSError như một RawValue có thể giải quyết những gì Hamish đã đề cập đến tài liệu tham khảo liên quan trên trong tương lai để Lỗi.

enum Error : Swift.Error { 
    typealias RawValue = NSError 

    case failedToAddInput 
    case failedToAddOutput 
    case failedToSetVideoOrientation 
} 
Các vấn đề liên quan