2015-09-02 2 views
0

Я пытаюсь создать приложение для забавных фактов. Он отображает случайную строку из массива каждый раз, затем этот факт удаляется из массива. Для меня код, когда приложение впервые запускается, получает новый массив фактов и сохраняет данные при закрытии приложения и использует массив из предыдущего запуска каждый раз после первого запуска. Моя проблема в том, что я получаю «Thread 1: signal SIGABRT», когда пытаюсь удалить строку из моего массива на моей четвертой последней строке. Скажите, пожалуйста, какие исправления мне нужно сделать. Я довольно новичок в программировании. Я ценю всю помощь, которую я получаю. Спасибо за ваше время.(lldb) error swift NSMutableArray

import Foundation 
let userDefaults = NSUserDefaults.standardUserDefaults() 

func isAppAlreadyLaunchedOnce()->Bool{ 
    let defaults = NSUserDefaults.standardUserDefaults() 

    if let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){ 
     println("App already launched") 
     return true 
    } 
    else{ 
     defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce") 
     println("App launched first time") 
     return false 
    } 
} 

struct newFactBook { 


    let factsArray : NSMutableArray = [ 
     "Ants stretch when they wake up in the morning.", 
     "Ostriches can run faster than horses.", 
     "Olympic gold medals are actually made mostly of silver.", 
     "You are born with 300 bones; by the time you are an adult you will have 206.", 
     "It takes about 8 minutes for light from the Sun to reach Earth.", 
     "Some bamboo plants can grow almost a meter in just one day.", 
     "The state of Florida is bigger than England.", 
     "Some penguins can leap 2-3 meters out of the water.", 
     "On average, it takes 66 days to form a new habit.", 
     "Mammoths still walked the earth when the Great Pyramid was being built."] 

} 

var checkLaunch = isAppAlreadyLaunchedOnce() 

var oldFunFactsArray : NSMutableArray = [] 

if(checkLaunch == false){ 
    oldFunFactsArray = newFactBook().factsArray.mutableCopy() as! NSMutableArray 
} 

else if (checkLaunch == true){ 
    oldFunFactsArray = userDefaults.objectForKey("key") as! NSMutableArray 
} 




func randomFacts1() -> (String, Int){ 
    var unsignedArrayCount = UInt32(oldFunFactsArray.count) 
    var unsignedRandomNumber = arc4random_uniform(unsignedArrayCount) 
    var randomNumber = Int(unsignedRandomNumber) 
    return (oldFunFactsArray[randomNumber] as! String, randomNumber) 

} 

oldFunFactsArray.removeObjectAtIndex(randomFacts1().1) // Thread 1: signal SIGABRT 
userDefaults.setObject(oldFunFactsArray, forKey:"key") 
userDefaults.synchronize() 
println(oldFunFactsArray) 

Это то, что я получил в области отладки:

App already launched 
2015-09-02 10:17:06.110 TestCode1[36860:1553790] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff8245403c __exceptionPreprocess + 172 
    1 libobjc.A.dylib      0x00007fff8743d76e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff82453eed +[NSException raise:format:] + 205 
    3 CoreFoundation      0x00007fff824477be -[__NSCFArray removeObjectAtIndex:] + 94 
    4 TestCode1       0x00000001001552a6 main + 806 
    5 libdyld.dylib      0x00007fff903bd5c9 start + 1 
    6 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 
+0

Почему вы используете 'stringForKey' вместо' boolForKey'? –

+0

Кроме того, зачем использовать 'NSMutableArray' вообще? Почему бы просто не использовать Swift 'Array '? –

+1

Кроме того, вы видели '' - [__ NSCFArray removeObjectAtIndex:]: метод мутирования, отправленный в неизменяемый объект''? Это означает, что ваш код ожидает 'NSMutableArray', но на самом деле он получил регулярный' NSArray'. –

ответ

-1

Даже установка все правильно, иногда Xcode дает нам NSArray вместо NSMutableArray. Чтобы получить NSMutableArray назад, так что вы можете удалить объекты, сделать это:

let immutable = array.mutableCopy() as! NSMutableArray 
+1

Это не «Xcode», «иногда» делает это. NSUserDefaults всегда возвращает неизменяемые объекты. Если вы хотите изменить что-то, возвращаемое из NSUserDefaults, вам нужно либо mutableCopy, либо поместить его в массив * Swift * (не NS!), Который является var. –

0

Вот что я сделал:

var modArray = oldFunFactsArray.mutableCopy() as! NSMutableArray 
modArray.removeObjectAtIndex(randomFacts1().1) 
oldFunFactsArray = modArray 

Я сделал новый массив и назначил его свой старый массив. Затем я удалил строку из моего нового массива и назначил мой старый массив новому массиву. Спасибо всем за помощь!