Неизменяемое значение типа "Any []" имеет только мутирующие члены с именем "append" в Swift, несмотря на то, что массив определен как "var",

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

`Immutable value of type 'Any[]' only has mutating members named 'append'`

Здесь мой код:

var contactsArray: Any[]!
func popoverWillClose(notification: NSNotification) {
    if popoverTxtName.stringValue != "" && popoverTxtContactInfo.stringValue != "" {
        contactsArray.append(makeDictionaryRecord(popoverTxtName.stringValue, withInfo: popoverTxtContactInfo.stringValue))
    }
}

(makeDictionaryRecord(withInfo:) метод принимает два String и возвращает Dictionary<String, Any>)

Мой исходный код определяет contactsArray как let, и позже я обнаружил, что это была моя ошибка, поэтому я изменил его на var. Тем не менее, до сих пор ничего не делалось.

Я также изменил тип компонентов contactsArray на AnyObject[], Any[] и AnyObject[]!, но ничего не изменилось вообще.

(При этом, поскольку contactsArray должен принимать Dictionary внутри него, он должен быть определен как Any[] или Any[]!, так как Dictionary определяется как struct, если я его понимаю правильно.)

Что случилось с моим кодом? Как правильно добавить компонент в contactsArray?

Ответы

Ответ 1

Проблема 1: Вы определили contactsArray как неявно развернутый Необязательный, но значения необязательных переменных всегда неизменны. Вы можете определить его таким образом, чтобы разрешить добавление значений:

var contactsArray: [Any]

Забастовкa >

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

Проблема 2: вы не дали массиву начальное значение - , когда компилятор начинает жаловаться на это, когда вы исправляете проблему 1 для неявно развернутого необязательного значения, то есть значение nil, поэтому вы получите исключение во время выполнения. Решение состоит в том, чтобы инициализировать переменную пустым массивом:

var contactsArray: [Any]! = []

Вам почти никогда не нужен дополнительный массив - пустой массив является таким же хорошим знаменем "без значений" как nil и более безопасным, для загрузки. Если вы все равно решите использовать необязательный массив, используйте обычный необязательный (т.е. Объявленный с ?), а не неявно развернутый:

var contactsArray: [Any]? = []

Ответ 2

Синтаксис объявления массива был изменен, теперь он

var contractsArray: [Any] = []

Также, если вы изменяете массив как часть структуры или перечисления, вы можете увидеть эту ошибку. Структура или перечисление - это тип значения, а методу требуется ключевое слово mutating:

struct contacts {
    var contactsArray:[Any] = []
    mutating func popoverWillClose(notification: NSNotification) {
        if popoverTxtName.stringValue != "" && popoverTxtContactInfo.stringValue != "" {

            contactsArray.append(makeDictionaryRecord(popoverTxtName.stringValue, withInfo: popoverTxtContactInfo.stringValue))
        }
    }
}

Кроме того, вы не можете сохранять экземпляры структуры с использованием методов mutating как константы с использованием ключевого слова let, ее нужно объявить как var, потому что значение переменной изменится при вызове функции mutating.