Ответ
Свойства структуры можно изменять, но с важным ограничением: методы, изменяющие свойства, должны быть помечены как mutating.
Почему это необходимо? Структуры в Swift — value-типы. При вызове метода создается копия структуры, и без mutating изменения не сохранятся.
Пример корректного изменения:
struct Point {
var x: Int
var y: Int
// Метод ДОЛЖЕН быть mutating
mutating func moveBy(x deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}
// Только переменная (var), не константа (let)
var point = Point(x: 0, y: 0)
point.moveBy(x: 5, y: 5) // Теперь point.x = 5, point.y = 5
Что нельзя делать:
struct Point {
var x: Int
// Ошибка компиляции: метод не mutating
func increment() {
x += 1 // ❌ Cannot assign to property: 'self' is immutable
}
}
let point = Point(x: 0)
point.x = 5 // ❌ Cannot assign to property: 'point' is a 'let' constant
Практические рекомендации:
- Используйте
mutatingдля методов, изменяющих любые свойства - Структура должна быть объявлена как
var, а неlet - Для вычисляемых свойств используйте
mutating getесли свойство изменяет self - Рассмотрите создание новой структуры вместо мутации для иммутабельных данных