协议扩展,变异函数
我使用的是swift 2.0,我在协议上有一个协议和一个扩展来创build一个方法的默认实现,代码如下:
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 } }
我后来在我的代码试图调用这个方法,并得到一个错误,读取:
“不能在不可变的值上使用变异成员:'self'是不可变的”
代码如下:
init(impresion: ColorImpressionableProtocol?){ super.init(nibName: nil, bundle: nil) adoptColorsFromImpresion(impresion) }
我唯一能想到的是,在这种情况下,“自我”是一个协议,而不是一个class级。 然而,我必须错过一些东西,使这个概念的工作,由一个协议定义的方法的默认实现编辑也由相同的协议定义的值。
感谢您的帮助和时间:)
如果你打算只用于类的协议,那么你可以使它成为一个类协议 (并删除mutating
关键字):
protocol ColorImpressionableProtocol : class { // ... func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) }
然后
init(impresion: ColorImpressionableProtocol?){ super.init(nibName: nil, bundle: nil) adoptColorsFromImpresion(impresion) }
编译没有问题。
可能的解决scheme是:
1)实现采用协议的方法的非变异版本。 即:采用类中的方法作为协议扩展。
2)使协议仅作为类的协议。如果你的协议只需要支持类,这是最简单的解决scheme。
3)确保只有值types采用这个协议。这可能在所有情况下都不是有用的。
这里是这个案例的详细解释和解决scheme。