2015-11-13 27 views
11

クラスのfiableイニシャライザを作成しようとしています。私のクラスは、ネットワークリクエストからの入力を使用して初期化されます。ネットワークは信頼性が低く、すべてのプロパティの存在をチェックし、それ以外の場合は失敗するように初期化子を作成したいと考えています。ディクショナリのメンバ 'subscript'へのあいまいな参照

私はアプローチで明らかなミスを指すように自由に感じなさい、ここにガードを使用するようにしようとしています:

public class JobModel { 
    let jobId: String 
    let status: String 
    let toName: String 
    let toAddress: String 
    let description: String 
    let fee: Int 
    let jobDate: NSDate 
    let fromName: String 
    let fromAddress: String 

    init?(job: [String:AnyObject]) throws { 
     guard self.jobId = job["jobid"] as! String else { 
      throw InitializationError.MissingJobId 
     } 

    } 
} 

guard self.jobId行がエラーと、コンパイルに失敗している: Ambiguous reference to member 'subscript'

このエラーを解決する方法はありますか?

+0

あなたは* *失敗したいですか(つまりリターン 'nil')または*スロー:

For classes, however, a failable initializer can trigger an initialization failure only after all stored properties introduced by that class have been set to an initial value and any initializer delegation has taken place.

クリス・ラットナーは、現在の動作がここに望ましくない言及しますプロパティが存在しない場合はエラー?それは2つの異なることです。 –

+1

エラーメッセージは誤解を招くようです: 'guard'ステートメントの後の式は、ブール結果またはオプションのバインディング(' let'構文)の評価結果を持たなければなりません。イニシャライザを呼び出す前に入力辞書*を検証することを検討してください。 – vadian

+0

@MartinR、私は、初期化の呼び出し元がなぜ初期化が失敗したのか、呼び出し元がnilを返すことによって得られないコンテキストを知るので、エラーをスローすることを好むでしょう。 –

答えて

8

guardには、BooleanTypeに準拠した条件が必要です。単純な割り当ては行いません。このようなものが必要です。

ただし、「クラスインスタンスのすべての保存プロパティを初期化してから初期化する必要があります」というエラーが表示されます。これは、スウィフトプログラミング言語で期待され、文書化されていますhttp://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html

関連する問題