【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)
}
編譯沒有問題。