2017-02-12 2 views
0

Короче после получения массивов от NSUserDefaults Я получаю Mutating method sent to immutable object ошибка при попытке изменить NSMutableArray value;Метод мутирования, отправленный в неизменяемую ошибку объекта с mutableCopy()

generalDone[self.todoTableView.selectedRow] = 1 

При сохранении NSUserDefaults я добавляю все NSMutableArray с до одного NSMutableArray. Подобно;

var saveArray:NSMutableArray = NSMutableArray() 
saveArray.removeAllObjects() 
saveArray.add(generalTodos) 
.. 
.. 
.. 
saveArray.add(generalDone) 
UserDefaults.standard.set(saveArray, forKey: "test3") 

Но когда я получаю массивы из NSUserDefault Я уверен, что это mutableCopy().

if UserDefaults.standard.value(forKey: "test3") != nil { 
    saveArray = UserDefaults.standard.mutableArrayValue(forKey: "test3").mutableCopy() as! NSMutableArray 

    generalTodos = saveArray[0] as! NSMutableArray 
    generalDone = saveArray[1] as! NSMutableArray 
} 

По-прежнему возникает такая же ошибка. Может быть, глупая идея, но я думаю, что массивы в saveArrays все еще не изменяемы. Но не знаю, как ими управлять. Каковы ваши идеи?

Попытка узнать быстро. Пожалуйста, будьте вежливы. -_-

+0

Могу ли я спросить, почему вы используете NSArray/NSMutableArray вообще? Это классы Cocoa Objective-C. Вы должны использовать _Swift_ массивы. Они делают вещи намного проще. – matt

+0

«но я думаю, что массивы в saveArrays все еще не изменяемы». Хорошее мышление. Возможно, вы создаете изменчивую копию 'saveArrays', но это не делает измененные в ней массивы. – matt

+0

Также я бы посоветовал не сохранять массив массивов в NSUserDefaults. Просто сохраните 'generalTodos' как свой собственный массив со своим собственным ключом. – matt

ответ

1

Если вы собираетесь использовать Objective-C NSMutableArray, то as! NSMutableArray не сделает этого; способ сделать NSMutableArray есть

let mutableArray = NSMutableArray(array: otherArray) 

Но вы должны использовать Swift массивы, а не Objective-C NSArray/NSMutableArray. Чтобы сделать массив Swift измененным, объявите его с var, а не let. Например, если generalTodos массив строк, можно сказать, что

var generalTodos = [String]() 
Смежные вопросы