Ответ
Ключевое слово mutating используется для обозначения методов структур (struct) и перечислений (enum), которые изменяют значения их свойств (self) или self целиком.
Зачем это нужно? По умолчанию методы value-типов (структур и перечислений) не могут изменять свои свойства, потому что внутри метода self является неизменяемым (let). Модификатор mutating явно дает на это разрешение.
Пример:
struct Point {
var x = 0.0, y = 0.0
// Этот метод изменяет свойства структуры
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
// Эквивалентно: self = Point(x: self.x + deltaX, y: self.y + deltaY)
}
}
var myPoint = Point(x: 1.0, y: 1.0)
myPoint.moveBy(x: 2.0, y: 3.0) // Работает, так как myPoint объявлен через 'var'
print(myPoint) // Point(x: 3.0, y: 4.0)
let constantPoint = Point(x: 1.0, y: 1.0)
// constantPoint.moveBy(x: 2.0, y: 3.0) // Ошибка компиляции: нельзя вызвать mutating метод для константы
Важные детали:
mutatingне используется с классами (class), так как они являются reference-типами и их методы могут изменять свойства по умолчанию.- Вызов
mutatingметода для экземпляра, объявленного как константа (let), вызовет ошибку компиляции. - Внутри
mutatingметода вы можете присвоить полностью новый экземпляр свойствуself.