2015-09-23 20 views
5

Tôi có một tình huống mà tôi đang cố gắng ghi đè NSError để cung cấp cho tôi một trường hợp của một lỗi Tôi sẽ sử dụng lại rất nhiều ."Không thể ghi đè 'init' đã được đánh dấu là không khả dụng" ngăn chặn ghi đè rỗng init

Mã của tôi đang làm việc cho đến khi tôi cập nhật Xcode và chuyển đổi sang Swift 2.

public class NAUnexpectedResponseTypeError: NSError { 
    public convenience init() { 
     let messasge = "The object fetched by AFNetworking was not of an expected type." 
     self.init(
      domain: "MyDomain", 
      code: 6782, 
      userInfo: [NSLocalizedDescriptionKey: messasge] 
     ) 
    } 
} 

Trình biên dịch nói Cannot override 'init' which has been marked unavailable. Tôi đã có thể hack xung quanh nó bằng cách làm này:

public class NAUnexpectedResponseTypeError: NSError { 
    public class func error() -> NSError { 
     let message = "The object fetched by AFNetworking was not of an expected type." 
     return NAUnexpectedResponseTypeError(
      domain: "MyDomain", 
      code: 6782, 
      userInfo: [NSLocalizedDescriptionKey: message] 
     ) 
    } 
} 

Vì vậy, câu hỏi của tôi là:

  1. Có cách nào để thêm một phương pháp rỗng init trong một tình huống như thế này?
  2. Nếu có đến 1, đó có phải là một ý tưởng tồi vì một lý do nào đó không?
  3. Cách giải quyết của tôi với phương pháp lớp là một cách thích hợp để giảm thiểu vấn đề này?

EDIT:

tôi đã đưa ra một cách giải quyết khác mà tôi thích tốt hơn so với cách giải quyết bằng phương pháp lớp. Tôi vẫn không hài lòng vì tôi không thể ghi đè lên phương thức rỗng init.

public class NAUnexpectedResponseTypeError: NSError { 
    public convenience init(message: String?) { 
     var errorMessage: String 
     if let message = message { 
      errorMessage = message 
     } else { 
      errorMessage = "The object fetched by AFNetworking was not of an expected type." 
     } 
     self.init(
      domain: "MyDomain", 
      code: 6782, 
      userInfo: [NSLocalizedDescriptionKey: errorMessage] 
     ) 
    } 
} 
+1

Bạn có đang thêm mã vào lớp học của mình ngoài những gì được hiển thị ở đây không? Bởi vì tôi tự hỏi tại sao một lớp con thậm chí còn cần thiết. –

+0

@TomHarrington Bạn có đề nghị một cái gì đó giống như một phần mở rộng cho NSError? – Jonathan

Trả lời

3

Vì không thể tạo ra nhiều phiên bản dữ liệu giống nhau. Chỉ cần tạo một đĩa đơn, liên tục, ví dụ:

let NAUnexpectedResponseTypeError = NSError(domain: "MyDomain", 
    code: 6782, 
    userInfo: [NSLocalizedDescriptionKey: "The object fetched by AFNetworking was not of an expected type."] 
) 

Nếu bạn có một tình huống đó không phải là hằng số, sau đó nó là hầu như luôn luôn tốt hơn để mở rộng chứ không phải là lớp con NSError. Ví dụ:

extension NSError { 
    class func MyError(code code:code, message: String) -> NSError { 
     return NSError(domain: "MyDomain", 
         code: code, 
         userInfo: [NSLocalizedDescriptionKey: message]) 
    } 
} 

Đây là loại phần mở rộng (như một phạm trù) có một lịch sử lâu dài trong ObjC, và là một mô hình tốt để mang đến cho Swift (nếu bạn không thể dễ dàng sử dụng enum ErrorTypes, mà thậm chí còn tốt hơn Nhanh).

Trong nhiều trường hợp, tôi thấy dễ dàng hơn khi chỉ có chức năng cấp cao nhất cho điều này, thay vì mở rộng NSError. Ví dụ:

private func makeError(code code:code, message: String) -> NSError { 
    return NSError(domain: "MyDomain", 
        code: code, 
        userInfo: [NSLocalizedDescriptionKey: message]) 
} 

(Cá nhân tôi sử dụng các loại chức năng tất cả các thời gian trong Swift khi tôi phải sử dụng NSError Trong ObjC, tôi thường sử dụng loại trên NSError Không chắc lý do tại sao tôi đã thay đổi, nhưng nó cảm thấy nhiều hơn nữa.. tự nhiên.)

+0

Rất hữu ích và kỹ lưỡng. Cảm ơn rất nhiều! – Jonathan

3

Bạn không thể ghi đè init trống, được đánh dấu là không khả dụng nên bạn không được phép làm bất cứ điều gì với nó.

Bạn làm có một cách giải quyết mặc dù

public class NAUnexpectedResponseTypeError: NSError { 

    public convenience init(message: String = "The object fetched by AFNetworking was not of an expected type.") { 
      self.init(
       domain: "MyDomain", 
       code: 6782, 
       userInfo: [NSLocalizedDescriptionKey: message] 
     ) 
    } 
} 

tôi không kiểm tra nó, nhưng nó phải làm việc.

Vì bạn đang sử dụng nhanh 2.0, tại sao bạn không làm cho cá thể của bạn phù hợp với loại lỗi thay vì phân lớp NSError? Nó sẽ sạch hơn và thành ngữ hơn.

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