2015-09-09 68 views
13

我使用迅速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) 
} 

我能想到的唯一的事情就是在这种情况下'自我'是一种协议,而不是一类。然而,我必须错过一些东西来使这个概念发挥作用。一个由协议定义的方法的缺省实现,该协议编辑也由相同协议定义的值。

谢谢您的帮助和时间:)

回答

28

如果你打算只使用了类的协议,那么你可以让 它类协议(和删除mutating关键字):

protocol ColorImpressionableProtocol : class { 

    // ... 

    func adoptColorsFromImpresion(impresion: ColorImpressionableProtocol?) 
} 

然后

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

编译没有问题。

+0

我相信这是我正在尝试做的正确语法,Perfecto! 谢谢 – CWineland

+0

我不得不问这是出于理智的缘故......还有什么可以实现一个协议,除了一个类,什么是防范?我只是没有看到任何其他的结果,但一个类符合它 – CWineland

+1

@CWineland:协议也可以通过一个结构来实现。 –

0

可能的解决方案是:

1)实施,其中所述协议 被采用的方法的非不同诱变版本。即:采用类中的方法而不是 协议扩展。

2)将协议设置为仅用于类的协议。如果您的协议只需要支持类,则它是最简单的解决方案。

3)确保只有值类型采用此协议。这可能在 所有情况下都不会有用。

Here是此案例的详细解释和解决方案。

+0

请在评论中添加此类型的答案 –