2015-11-13 48 views
11

我正在嘗試爲類創建一個failable初始化程序。我的課程將使用來自網絡請求的輸入進行初始化。網絡不可靠,我想創建一個初始化程序來檢查所有屬性的存在性,否則就會失敗。詞典中對成員「下標」的歧義引用

我試圖利用後衛的位置,所以請隨時點在接近任何明顯的失誤:

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')或*拋*如果該屬性不存在,則出現錯誤?這是兩回事。 –

+1

錯誤消息似乎是誤導性的:'guard'語句後面的表達式必須具有布爾結果或可選綁定('let'語法)的評估結果。考慮在調用初始化程序之前驗證輸入字典*。 – vadian

+0

@MartinR,我更願意拋出一個錯誤,因爲初始化者的調用者會知道爲什麼初始化失敗,調用者不會返回nil的上下文。 –

回答

8

guard需要一個符合BooleanType的條件。簡單的分配不。你需要這樣的東西。

guard let j = job["jobid"] as? String else { 
    throw InitializationError.MissingJobId 
} 
self.jobId = j 

但是,那麼你會得到錯誤「類實例的所有存儲性能必須從初始化拋出之前被初始化。」這是預期,並記錄在雨燕編程語言:

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.

克里斯·拉特納提到了目前的行爲是不可取的位置:http://swift-language.2336117.n4.nabble.com/Swift-2-throwing-in-initializers-td439.html

相關問題