【IOS】協議(protocol)擴充套件,變異功能

2020-10-31 IOS

我使用的是swift 2.0,我有一個協議(protocol)和該協議(protocol)的擴充套件來建立方法的預設實現,程式碼如下:

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)
}

我唯一想到的是這種情況下的“Self”是協議(protocol),而不是類。但是,我必須缺少一些東西才能使該概念起作用。該協議(protocol)定義的方法的預設實現,該方法還可以編輯同一協議(protocol)定義的值。

謝謝您的幫助和時間:)

解決辦法

如果您打算僅將協議(protocol)用於類,則可以使
它是一個類協議(protocol)(並刪除mutating關鍵字):

protocol ColorImpressionableProtocol : class {

    // ...

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?)
}

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

編譯沒有問題。

出處

Have any Question?

Let us answer it!