Интервью
November 19

Зачем нужно ключевое слово mutating в языке Swift?

👋 Слово mutating в языке Swift играет роль в определении того, как методы класса или структуры могут изменять их свойства.

Оно используется исключительно в структурах и перечислениях, так как эти типы по умолчанию передаются по значению, а не по ссылке.

Это означает, что изменения, внесенные в экземпляр структуры, не будут отражаться на оригинале, если вы не укажете, что метод может модифицировать состояние объекта.

Давайте подробнее рассмотрим, зачем нужно это ключевое слово и приведем несколько примеров.

Зачем нужен mutating?

  1. Изменение свойств структур и перечислений: Основная функция mutating заключается в том, чтобы указать, что метод будет изменять свойства экземпляра структуры, позволяя ему мутировать свое состояние.
  2. Обеспечение безопасности: Swift обеспечивает строгую типизацию и безопасность данных, и использование mutating помогает разработчикам сразу увидеть, где ведется изменение состояния.
  3. Синтаксический сахар: Ключевое слово служит напоминанием, что метод, который вы собираетесь вызвать, повлияет на текущий экземпляр, и помогает избегать путаницы.

Примеры использования

Давайте рассмотрим несколько примеров, чтобы лучше понять, как используется mutating.

Пример 1: Изменение свойства структуры

struct Counter {
    var count: Int = 0
    
    mutating func increment() {
        count += 1
    }
    
    mutating func reset() {
        count = 0
    }
}

var myCounter = Counter()
print(myCounter.count)  // Вывод: 0

myCounter.increment()
print(myCounter.count)  // Вывод: 1

myCounter.reset()
print(myCounter.count)  // Вывод: 0

В этом примере структура Counter имеет свойство count и два метода: increment и reset. Оба метода помечены как mutating, что позволяет им изменять значение count в экземпляре структуры.

Пример 2: Обновление значений в перечислении

enum Direction {
    case north, south, east, west

    mutating func turnRight() {
        switch self {
        case .north:
            self = .east
        case .east:
            self = .south
        case .south:
            self = .west
        case .west:
            self = .north
        }
    }
}

var currentDirection = Direction.north
print(currentDirection)  // Вывод: north

currentDirection.turnRight()
print(currentDirection)  // Вывод: east

Перечисление Direction - стороны света. Метод turnRight помечен как mutating, так как он изменяет текущее состояние перечисления currentDirection.

Слово mutating создает методы, которые изменяют состояние структуры или перечисления. Это поддерживает высокие стандарты безопасности и ясности в коде, что особенно полезно, когда вы работаете с передачей объектов по значению.

👋Если вам понравилась статья, не забудьте поставить лайк и подписаться на обновления, чтобы не пропустить новые материалы!