В Swift, как установить каждый элемент внутри массива в nil?

var roomsLiveStates = [Firebase?]()

for ref in roomsLiveStates {
        if ref != nil {
                ref = nil
            }
        }
}

Это не работает.

Ответ 1

Вы можете просто установить для каждого значение nil:

for index in 0 ..< roomsLiveStates.count {
    roomsLiveStates[index] = nil
}

Как говорит Swift Язык программирования в Control Flow обсуждение синтаксиса for:

В этом примере печатаются первые несколько записей в таблице из пяти раз:

for index in 1...5 {
    println("\(index) times 5 is \(index * 5)")
}

... В приведенном выше примере index является константой, значение которой автоматически устанавливается в начале каждой итерации цикла. Таким образом, он не должен быть объявлен до его использования. Он неявно объявляется просто его включением в объявление цикла, без необходимости в ключевом слове let.

Как говорится, index является константой. Таким образом, вы не можете изменить его значение.

Ответ 2

Вы также можете использовать map:

roomsLiveStates = roomsLiveStates.map { _ in nil }

Это меньше кода и хорошая привычка заниматься другими случаями, когда вы можете создать обработанную копию массива без изменения оригинала.

Ответ 3

Вы также можете просто переназначить весь массив на тот, который содержит только nil:

roomsLiveStates = [Firebase?](count: roomsLiveStates.count, repeatedValue: nil)

Хотя теперь, когда я думаю об этом, это не кажется таким хорошим, потому что (возможно?) выделяется новая память, которая не является быстрой *

EDIT: я только что проверил и обнаружил, что использование .map намного медленнее в сборках Debug. Однако в версиях Release .map на 20% быстрее. Поэтому я предлагаю использовать версию .map (которая также немного более симпатичная;)):

array = array.map { _ in nil }