2016-11-10 35 views
3

我有一個錯誤類是:更改錯誤localizedDescription

public enum ModelError: Error { 
    case invalidArray(model: String) 

    var localizedDescription: String { 
    switch self { 
    case .invalidArray(model: let model): 
     return "\(model) has an invalid array" 
    default: 
     return "modelError" 
    } 
    } 
} 

,當作爲一個回調函數的Error過去了,我想訪問其自定義localizedDescription。例如:

func report(_ error: Error) { 
    print("Error report: \(error.localizedDescription)") 
} 

但調用report(ModelError.invalidArray(model: "test"))打印:

"The operation couldn’t be completed. (ModelError error 0.)" 

這樣的事情似乎是可行的與NSError因爲我可以有覆蓋localizedDescription財產。但我不想使用NSError,因爲這不是一件很快捷的事情,很多圖書館都可以使用Error

+1

不應該'ModelError(型號: 「測試」)'是'ModelError.invalidArray(型號: 「文本」)'? – rmaddy

+0

是的,壞的複製粘貼。謝謝! – Guig

+0

如果'ModelError'符合'CustomStringConvertible'並且'localizeDescription'被重命名爲'description',我可以使你的代碼工作。然後打印'error'而不是'error.localizedDescription'。 – rmaddy

回答

1

根據Documentation,localizedDescription是在協議擴展中實現的,而不是在協議聲明中實現的,這意味着沒有什麼要遵守或覆蓋。對於遵守Error的枚舉有一個類型範圍的接口。

我的方式,我解決這個得到的是使用包裝協議:

protocol LocalizedDescriptionError: Error { 
    var localizedDescription: String { get } 
} 

public enum ModelError: LocalizedDescriptionError { 
    case invalidArray(model: String) 

    var localizedDescription: String { 
     switch self { 
     case .invalidArray(model: let model): 
      return "\(model) has an invalid array" 
     default: 
      return "modelError" 
     } 
    } 
} 

let error: LocalizedDescriptionError = ModelError.invalidArray(model: "Model") 
let text = error.localizedDescription // Model Has an invalid array 
+1

上述工作只是因爲您聲明'error'常量是(專用的)'LocalizedDescriptionError'類型。如果你允許它是(base)'Error'類型的話,它將會發送到'Error'協議中的默認實現,因爲 - 正如你所提到的 - 'localizedDescription'沒有在'Error'協議本身中聲明,因此不能被覆蓋。相反,必須使用新的LocalizedError協議。 – Gary