2015-09-09 66 views
13

我使用迅速2.0,我有一個協議和在協議來創建的方法的缺省的實現的延伸部,該代碼是作爲休耕:協議擴展,突變功能

protocol ColorImpressionableProtocol { 

    var lightAccentColor: UIColor? {get set} 
    var accentColor: UIColor? {get set} 
    var darkAccentColor: UIColor? {get set} 
    var specialTextColor: UIColor? {get set} 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

extension ColorImpressionableProtocol { 

    mutating func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?){ 
     lightAccentColor = impresion?.lightAccentColor 
     accentColor = impresion?.accentColor 
     darkAccentColor = impresion?.darkAccentColor 
     specialTextColor = impresion?.specialTextColor 
    } 
} 

我稍後在我的代碼試圖調用此方法和我得到的是一條錯誤:

「不能一成不變值使用可變成員:‘自我’是不可改變的」

的代碼是休耕:

init(impresion: ColorImpressionableProtocol?){ 
     super.init(nibName: nil, bundle: nil) 
     adoptColorsFromImpresion(impresion) 
} 

我能想到的唯一的事情就是在這種情況下'自我'是一種協議,而不是一類。然而,我必須錯過一些東西來使這個概念發揮作用。一個由協議定義的方法的缺省實現,該協議編輯也由相同協議定義的值。

謝謝您的幫助和時間:)

回答

28

如果你打算只使用了類的協議,那麼你可以讓 它類協議(和刪除mutating關鍵字):

protocol ColorImpressionableProtocol : class { 

    // ... 

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

然後

init(impresion: ColorImpressionableProtocol?){ 
    super.init(nibName: nil, bundle: nil) 
    adoptColorsFromImpresion(impresion) 
} 

編譯沒有問題。

+0

我相信這是我正在嘗試做的正確語法,Perfecto! 謝謝 – CWineland

+0

我不得不問這是出於理智的緣故......還有什麼可以實現一個協議,除了一個類,什麼是防範?我只是沒有看到任何其他的結果,但一個類符合它 – CWineland

+1

@CWineland:協議也可以通過一個結構來實現。 –

0

可能的解決方案是:

1)實施,其中所述協議 被採用的方法的非不同誘變版本。即:採用類中的方法而不是 協議擴展。

2)將協議設置爲僅用於類的協議。如果您的協議只需要支持類,則它是最簡單的解決方案。

3)確保只有值類型採用此協議。這可能在 所有情況下都不會有用。

Here是此案例的詳細解釋和解決方案。

+0

請在評論中添加此類型的答案 –