一尘不染

协议扩展,变异功能

swift

我正在使用swift 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)
}

我唯一想到的是这种情况下的“
Self”是协议,而不是类。但是,我必须缺少一些东西才能使该概念起作用。该协议定义的方法的默认实现,该方法还可以编辑同一协议定义的值。

谢谢您的帮助和时间:)


阅读 189

收藏
2020-07-07

共1个答案

一尘不染

如果您打算仅将协议用于类,则可以将其设为 类协议 (并删除mutating关键字):

protocol ColorImpressionableProtocol : class {

    // ...

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?)
}

然后

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

编译没有问题。

2020-07-07