Swift 2在协议扩展中使用变异函数的错误“不能在不可变的值上使用变异成员:'self'是不可变的
不知道这里发生了什么,这似乎应该是非常简单的。 我有一个可变的协议,一个带有变异函数的扩展。 当我试着在扩展中声明mtkAnimQueAppend时,事情在testClass.testFunc中出现,我得到这个错误: “不能在不可变的值上使用变异成员:'self'是不可变的。
protocol MTKAnimateValueDelegate { var mtkAnimQue:[MTKAnimateValue]? {get set} } extension MTKAnimateValueDelegate { ///Adds element to que mutating func mtkAnimQueAppend(element:MTKAnimateValue) { if mtkAnimQue != nil { mtkAnimQue?.append(element) } else { mtkAnimQue = [element] } } } class testClass: MTKAnimateValueDelegate { var mtkAnimQue:[MTKAnimateValue]? func testFunc() { var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2) animValue.isAnimating = true mtkAnimQueAppend(animValue) //ERROR: "Cannot use mutating member on immutable value: 'self' is immutable } }
问题是,在协议中,你把这个函数标记为mutating,如果你想在一个结构体上使用这个协议,你需要这样做。 然而,传递给testFunc
的self是不可变的(它是对类的一个实例的引用),并且正在跳过编译器。 这是有道理的,如果testClass实际上是一个结构,你可以使该函数mutated来解决这个问题。
我可以看到两个解决方法:
-
只做协议类
protocol MTKAnimateValueDelegate: class { ...
-
使testClass成为一个结构并将testFunc标记为变异。
无论哪种方式,我认为这是一个需要向苹果报告的错误。