Будучи значениями, структуры типа являются неизменяемыми. Значение других переменных не может изменить значения экземпляра структуры в любой заданной точке.
Мутантное слово требуется для ТОЛЬКО изменения значений собственных переменных внутри функции структуры.
Для получения. например,
struct MyStruct {
var abc: String = "initila value"
func changeValue() {
abc = "some other value". //Compile time error: Cannot assign to property: 'self' is immutable. Mark method 'mutating' to make 'self' mutable.
}
}
Здесь, когда мы пытаемся изменить значение переменной abc внутри функции, объявленной в самой struct, мы получаем ошибку времени компиляции.
Итак, здесь нам нужно изменить функцию, чтобы изменить ее значение внутри структуры. Следовательно, правильный код будет:
struct MyStruct {
var abc: String = "initila value"
mutating func changeValue() {
abc = "some other value"
}
}
EDIT:
При объявлении протокола он может быть объявлен обычно для ссылочных типов и типов значений, поэтому сами протоколы такого типа объявляют функции как мутирующие, так что они могут быть приняты как классами, так и структурами.
Поскольку это ссылочный тип, ключевое слово mutating удаляется (или мы можем сказать, что это не обязательно) в классах, но для структур, являющихся типами значений, ключевое слово mutating является обязательным.
Из документов:
Если вы определяете требование метода экземпляра протокола, предназначенное для изменения экземпляров любого типа, который принимает протокол, пометьте метод с помощью ключевого слова mutating как часть определения протокола. Это позволяет структурам и перечислениям принимать протокол и удовлетворять этому требованию метода.
Если вы помечаете требование метода экземпляра протокола как изменяющееся, вам не нужно писать ключевое слово с мутацией при написании реализации этого метода для класса. Ключевое слово mutating используется только структурами и перечислениями.
Ссылка
Надеюсь, это очистит ваше сомнение.