Swift 2 Ошибка при использовании функции mutating в расширении протокола "Нельзя использовать мутирующий элемент в неизменяемом значении:" self "неизменен

Не уверен, что происходит здесь, похоже, что это должно быть довольно прямолинейно. У меня есть протокол, который изменяет var, расширение с функцией mutating. Вещи вылезают в 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.