2015-09-23 19 views
5

Bana bir hata örneği sağlamak için NSError geçersiz kılmaya çalıştığım bir durum var Çok yeniden kullanacağım . Xcode güncelleştirilmiş ve derleyici Cannot override 'init' which has been marked unavailable diyor "Geçersiz" işaretli "init" geçersiz kılınabilir "boş girdiyi geçersiz kılmayı engeller

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

Swift 2.

dönüştürülen kadar

Kodum çalışıyordu.

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

Yani, benim sorum: Böyle bir durumda boş init yöntemi eklemek için bir yol

  1. var mı Bunu yaparak etrafında kesmek başardı?
  2. Eğer 1'e evet ise, bu bir sebepten dolayı kötü bir fikir midir?
  3. Bu sorunu gidermek için uygun bir yöntem olarak sınıf yöntemiyle geçici çözüm var mı?

DÜZENLEME:

ben sınıf yöntemi ile çözüm daha iyi gibi başka çözüm ile geldi. Yine de boş olmamasına rağmen boş init yöntemini geçersiz kılamam. NSError yana

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

Burada gösterilenin yanı sıra sınıfınıza daha fazla kod ekliyor musunuz? Çünkü bir alt sınıfın neden gerekli olduğunu merak ediyorum. –

+0

@TomHarrington NSError için bir uzantı gibi bir şey önerir misiniz? – Jonathan

cevap

3

aynı verilerin birden çok örneğini oluşturmak için hiçbir neden yok, sabittir. Sadece tek bir sabit, örneğini oluşturmak: Eğer sabit olmayan bir durum varsa

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

, o zaman alt sınıf NSError yerine genişletmek için hemen hemen her zaman daha iyidir. Örneğin:

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

(bir kategori olarak) uzantısı Bu tür objc içinde uzun bir geçmişe sahiptir ve Swift (getirmek için iyi bir kalıptır kolayca daha iyi olan enum ErrorTypes, kullanamıyorsanız Swift).

Çoğu durumda, NSError'u uzatmak yerine, bunun için en üst düzey bir işleve sahip olmayı daha da kolay buluyorum. Örneğin:..

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

(Şahsen ben NSError kullanmak zorunda zaman değişti neden objc, ben genellikle NSError üzerinde kategoriler kullanılan emin değil Swift işlevleri bu tür her zaman kullanmak, ama daha hissediyor doğal.)

+0

Çok yardımsever ve kapsamlı. Çok teşekkürler! – Jonathan

3

Boş başlangıç ​​noktasını geçersiz kılabilirsiniz, kullanılamaz olarak işaretlenir, böylece hiçbir şey yapamazsınız.

Sence test etmedi

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

olsa başka bir çözüm var, ama çalışması gerekir.

Hızlı 2.0 kullandığınız için, neden örnekleminizi NSError alt sınıfının yerine hata türüne uygun hale getirmiyorsunuz? Daha temiz ve daha idiyicik olurdu.

İlgili konular