2015-09-23 9 views
5

私はエラーのインスタンスを提供するためにNSErrorをオーバーライドしようとしています。 。"使用できないとマークされた 'init'を無効にすることはできません。空のinitを無効にします。

私のコードは、私はXcodeのを更新するまでの作業とスウィフト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] 
     ) 
    } 
} 

に変換されたコンパイラがCannot override 'init' which has been marked unavailableを言います。私はこれを行うことにより、その周りハックすることができました:

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

だから、私の質問は次のとおりです。

  1. このような状況では、空initメソッドを追加する方法はありますか?
  2. 「はい」の場合は、何らかの理由で悪い考えですか?
  3. この問題を軽減する適切な方法は、クラスメソッドの回避策ですか?

EDIT:

私はクラスメソッドと回避策よりも良いような別の回避策を思い付きました。私はまだ空の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

ここに表示されている以外のクラスにコードを追加していますか?なぜサブクラスが必要なのか不思議です。 –

+0

@TomHarrington NSErrorの拡張機能のようなものをお勧めしますか? – Jonathan

答えて

3

NSErrorは不変なので、同じデータの複数のインスタンスを作成する必要はありません。 1つだけ、定数、インスタンスを作成します。あなたが一定でない状況がある場合は

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

が、サブクラスNSErrorではなく拡張するために、ほとんど常により良いです。たとえば、次のように

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

(カテゴリなど)の拡張のこの種のにObjCで長い歴史を持ち、スウィフト(にもたらすための良いパターンである、あなたは簡単にも優れているenum ErrorTypesを使用できない場合迅速)。

多くの場合、NSErrorを拡張するのではなく、トップレベルの機能を持つだけで簡単に見つけることができます。たとえば:。。

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

(個人的に私はNSErrorを使用する必要があるとき、私は変更私はなぜにObjCで、私は一般的にNSErrorでカテゴリを使用わからないスウィフトの関数のこれらの種類のすべての時間を使用していますが、それはより多くを感じています

+0

非常に有用で徹底的。どうもありがとう! – Jonathan

3

空のinitを無効にすることはできません。使用できないとマークされているため、何もすることはできません。

あなたは

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

かかわらず、別の回避策を持っていない私はそれをテストしていないが、それは動作するはずです。

あなたはswift 2.0を使用しているので、NSErrorをサブクラス化するのではなく、インスタンスをエラータイプに適合させるのはなぜですか?よりクリーンでより慣用的なものになるでしょう。

関連する問題