Swift 2 在协议扩展中使用变异函数时出错“无法在不可变值上使用变异成员:'self' 是不可变的
Swift 2 Error using mutating function in Protocol extension "Cannot use mutating member on immutable value: 'self' is immutable
不确定这里发生了什么,这看起来应该很简单。我有一个可变变量协议,一个带有变异函数的扩展。 testClass.testFunc 中出现问题,当我尝试使用扩展中声明的 mtkAnimQueAppend 时,出现此错误:"不能在不可变值上使用可变成员:'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
}
}
问题是,在协议中,您将函数标记为变异,如果您想在结构上使用协议,则需要这样做。但是,传递给 testFunc
的 self 是不可变的(它是对 class 实例的引用),这会导致编译器出错。如果 testClass 实际上是一个结构并且您可以使函数发生变异以解决问题,这将是有意义的。
我可以看到两个解决方法:
只制定协议 class
protocol MTKAnimateValueDelegate: class { ...
将 testClass 设为结构并将 testFunc 标记为变异。
无论如何,我认为这是一个需要报告给 Apple 的错误。
编辑
- 另一种解决方法是制作
self
的可变副本
func testFunc() {
var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2)
animValue.isAnimating = true
var mutableSelf = self
mutableSelf.mtkAnimQueAppend(animValue)
}
由于 mutableSelf
是引用,变异函数所做的任何更改仍将反映在 self
的状态中。
不确定这里发生了什么,这看起来应该很简单。我有一个可变变量协议,一个带有变异函数的扩展。 testClass.testFunc 中出现问题,当我尝试使用扩展中声明的 mtkAnimQueAppend 时,出现此错误:"不能在不可变值上使用可变成员:'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
}
}
问题是,在协议中,您将函数标记为变异,如果您想在结构上使用协议,则需要这样做。但是,传递给 testFunc
的 self 是不可变的(它是对 class 实例的引用),这会导致编译器出错。如果 testClass 实际上是一个结构并且您可以使函数发生变异以解决问题,这将是有意义的。
我可以看到两个解决方法:
只制定协议 class
protocol MTKAnimateValueDelegate: class { ...
将 testClass 设为结构并将 testFunc 标记为变异。
无论如何,我认为这是一个需要报告给 Apple 的错误。
编辑
- 另一种解决方法是制作
self
的可变副本
func testFunc() {
var animValue = MTKAnimateValue(fromValue: 10, toValue: 20, inSeconds: 2)
animValue.isAnimating = true
var mutableSelf = self
mutableSelf.mtkAnimQueAppend(animValue)
}
由于 mutableSelf
是引用,变异函数所做的任何更改仍将反映在 self
的状态中。