2015-02-09 5 views
0

Я слишком долго сидел на проблеме, и я действительно не понимаю, почему это происходит. Я искал в Интернете решения, и я пробовал каждый из них, и все же я получаю эту проблему. Я инициализирую словарь в Swift, а затем добавляю в него некоторые значения, но сразу после добавления ключей/значений словарь пуст (проверка в режиме отладки), а также нуль в коде при попытке прочитать из него , Это мой текущий код:Swift Словарь заполнен, но все еще пуст

я сначала получить PLIST, где я хочу добавить мой словарь:

var path = NSBundle.mainBundle().pathForResource("Questions", ofType: "plist") 
var dict = NSDictionary(contentsOfFile: path!)! 
var questionsArr = dict.objectForKey("Math") as NSArray 
var questionsMutableArray:NSMutableArray = questionsArr.mutableCopy() as NSMutableArray 

Затем я создаю и добавить значения в моем словаре

//I have also tried with this and got the same result: var newDict = Dictionary<String, String>() 
var newDict = [String: String]() 
newDict["Question"] = "What is 1+1" 
newDict["A"] = "One" 
newDict["B"] = "Two" 
newDict["C"] = "Three" 

newDict кажется пустым в режиме отладки прямо здесь. Тогда я пишу словарь в мой PLIST:

questionsMutableArray.addObject(newDict) 
questionsMutableArray.writeToFile(path!, atomically: true) 

Позже в коде я получаю мой PLIST вроде этого (который работал раньше, когда я еще не добавил newDict:

var path = NSBundle.mainBundle().pathForResource("Questions", ofType: "plist") 
var dict = NSDictionary(contentsOfFile: path!)! 

На последнем линия (NSDictinoary (contentsOfFile:! путь) Я получаю эту ошибку:?!

fatal error: unexpectedly found nil while unwrapping an Optional value 

кто-нибудь знает, почему это происходит Помощь будут оценены

РЕДАКТИРОВАТЬ Раствор в 4)

1. I'm getting an array of dictionaries from my plist (Questions). 
2. I add a new dictionary to my array of dictionaries. 
3. I write/save it to the plist. 
4. I get the array from the plist again and investigate the content of it. 
5. The new dictionary I just added is not there. 

Это код:

1) questionsArr пуст

var bundlepath:NSString = NSBundle.mainBundle().pathForResource("Questions", ofType: "plist")! 

     var dict = NSMutableDictionary(contentsOfFile: bundlepath)! 
     var questionsArr = dict.objectForKey("Math") as NSArray 
     var questionsMutableArray:NSMutableArray = questionsArr.mutableCopy() as NSMutableArray 

2) questionsMutableArray ш как пустой, и теперь в нем возникает новый вопрос.

var newDict = [String: String]() 
    newDict["QuestionTitle"] = "What is 1+1?" 
    newDict["A"] = "One" 
    newDict["B"] = "Two" 
    newDict["C"] = "Three" 

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString 
var path:NSString = documentsPath.stringByAppendingPathComponent("Questions.plist"); 

questionsMutableArray.addObject(newDict) 
dict["Math"] = questionsMutableArray 

3)

let didItSave = dict.writeToFile(path, atomically: true) 

4) questionsArr еще пуст. Если я использую «путь» вместо «bundlepath», он работает!

dict = NSMutableDictionary(contentsOfFile: bundlepath)! //<- I USED 'path' INSTEAD OF 'bundlepath' and now it works! 
    questionsArr = dict.objectForKey("Math") as NSArray 
+0

Можете ли вы показать код, где вы его найдете. Опубликованный код не помогает идентифицировать проблему. –

+0

Не уверен, как это работает быстро, но ваш словарь должен быть «изменен», если вы хотите добавить к нему материал. – user3386109

+1

Изменчивость коллекции в Swift определяется тем, присвоили ли вы словарь переменной или константе, а не по имени класса, как в Objective-C. –

ответ

2

Вы пытаетесь написать iOS Bundle. Пакет iOS читается только, вы не можете писать.

Я рекомендовал бы вам написать в каталог документов Попробуйте этот путь

var bundlepath:NSString= NSBundle.mainBundle().pathForResource("Questions", ofType: "plist") 

    var dict = NSDictionary(contentsOfFile: bundlepath)! 
    var questionsArr = dict.objectForKey("Math") as NSArray 
    var questionsMutableArray:NSMutableArray = questionsArr.mutableCopy() as NSMutableArray 


    //I have also tried with this and got the same result: var newDict = Dictionary<String, String>() 
    var newDict = [String: String]() 
    newDict["Question"] = "What is 1+1" 
    newDict["A"] = "One" 
    newDict["B"] = "Two" 
    newDict["C"] = "Three" 

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString 
    var path:NSString = documentsPath.stringByAppendingPathComponent("Questions.plist"); 



questionsMutableArray.addObject(newDict) 

// присваиваем массив обратно в словарь. ДИКТ [ "Math"] = questionsMutableArray

dict.writeToFile(path!, atomically: true) 

    var dictFromDisk = NSDictionary(contentsOfFile: path)! 
+0

Я получаю эту ошибку: «Неустранимая ошибка: неожиданно найден nil при развертывании необязательного значения» при выполнении третьей строки. – user2099024

+0

В основном то, что вы пытаетесь выполнить, загружает plist из пакета и добавляет словарь в массив и сохраняет на диск. Но вам нужно загрузить файл plist из каталога Document для следующего чтения, после чего ваши данные будут согласованы. – Shashi3456643

+0

Я попробую завтра и дам вам знать. Не в состоянии атм. Заранее спасибо! – user2099024

0

Ваш файл PLIST массив словарей, поэтому, когда вы извлекаете его, вы должны получить его как NSArray, а затем бросить его как массив Dictionary<String, String>

let array = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource("Questions", ofType: "plist")!) as [[String: String]] 

Тогда вы получить доступ к определенному словарь в этом массиве, используя:

let someDict = array[someIndex] 
+0

Моя «Root» -key в Question.plist - это словарь, содержащий массивы, в котором также содержится много словарей. – user2099024

+0

Почему бы просто не сделать свой корневой объект массивом? – Ian

+0

Я не знаю, почему я это сделал, но теперь это так. Проблема в том, что мой newDict пуст после того, как я инициализировал его и добавил к нему элементы. Я не понимаю, почему. – user2099024

0

Отредактированный мой ответ:

Вы сохраняете массив со следующей строкой

questionsMutableArray.writeToFile(path!, atomically: true) 

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

dict["Math"] = questionsMutableArray 
dict.writeToFile(path!, atomically: true) 
+0

Моя «Root» -key в Question.plist - это словарь, который содержит массивы, которые также содержат много словарей. – user2099024

+0

Вы читаете вопросы от dict ["math"], но вы добавляете новые в другой массив и заменяете свой старый plist этим массивом. Итак, ваш файл plist больше не является словарем. Ваши текущие записи и чтения несовместимы. Пожалуйста, проверьте мой отредактированный ответ, чтобы решить проблему. –

2

Во-первых, когда вы извлекаете PLIST, получить его в NSMutableDictionary

var dict = NSMutableDictionary(contentsOfFile: path!)! 

Тогда, как только у вас есть массив создан, установить ключ словаря Math к нему ,

dict["math"] = questionsMutableArray 

Затем напишите словарь на своем пути. Может захотеть посмотреть, сработала ли она, writeToFile возвращает bool.

let didItSave = dict.writeToFile(path!, atomically: true) 
+0

Это работает с 'writeToFile' частью. Я вижу, что мой новый словарь сохраняется в 'dict [" math "]'. Но после того, как я напишу его в файл, а затем снова его заново (прочитав plist), нового дикта нет! – user2099024

+0

Пожалуйста, проверьте мои изменения! – user2099024

Смежные вопросы