协议扩展,变异函数

我使用的是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。