Неизменяемое значение типа "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.