Swift 2 Ошибка использования мутирующей функции в расширении протокола. "Невозможно использовать мутирующий член для неизменяемого значения:" self "является неизменным.
Не уверен, что здесь происходит, похоже, все должно быть довольно просто. У меня есть протокол, который изменяемый var, расширение с мутирующей функцией. В 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
}
}
1 ответ
Проблема в том, что в протоколе вы помечаете функцию как мутирующую, что необходимо сделать, если вы хотите использовать протокол в структуре. Тем не менее, Я, которое передается testFunc
является неизменным (это ссылка на экземпляр класса), и это запускает компилятор. Это имело бы смысл, если бы testClass был на самом деле структурой, и вы могли бы изменить функцию, чтобы решить проблему.
Я вижу два обходных пути:
сделать только класс протокола
protocol MTKAnimateValueDelegate: class { ...
Сделайте testClass структурой и пометьте testFunc как мутирующий.
В любом случае, я думаю, что это ошибка, о которой нужно сообщить в Apple.