2016-02-28 103 views
3

我試圖做到以下幾點:從繼承函數拋出異常而不拋出

protocol X{ 
    func foo() 
} 
enum XError{ 
    case BAR 
} 
class Y:X{ 
    func foo(){ 
     throw XError.BAR 
    } 
} 

我不能添加拋出聲明的協議,並抱怨說,

的錯誤不會被處理,因爲封閉函數不是 聲明'拋出'。

我該如何做到這一點?

回答

7

您需要明確地添加拋出任何拋出的函數的簽名。

所以

func foo() throws{ 
    throw XError.BAR 
} 

這也適用於該協議定義。

protocol X { 
    func foo() throws 
} 

Swift中的錯誤應該符合Error協議。

enum XError: Error { 
    case BAR 
} 
+0

因此,如果我繼承方法簽名而沒有從協議拋出我無法控制我不能拋出異常? –

+0

否,因爲任何使用協議實例的代碼都不使用'try'或處理任何異常。 –

+0

所以,如果我添加拋出我的方法簽名,它會停止符合協議,如果我不,我不能有適當的異常處理......是這種語言的某種限制?有辦法解決這個問題嗎? –