2015-05-31 1 views
2

Я хотел бы сохранить некоторые данные конфигурации в моем файле plist, который содержит массивы и обычные типы переменных. Это выглядит следующим образом:Как сохранить данные в многомерном массиве в файле plist

(http://s10.postimg.org/f2xpgur1l/plist.png) (жаль, что я не могу прикрепить любое изображение)

Моя функция, сделать это выглядит так:

// Saves the data into a plist file 
func saveObject(i_fileName: String, i_keyForValueToSave: String, i_valueToSave: String, i_keyForXInitializer:String, i_valueXInitializer: String) { 

    var fileName: String = i_fileName 

    var keyForValueToSave: String = i_keyForValueToSave 
    var valueToSave: AnyObject = i_valueToSave 

    var keyForXInitializer: String = i_keyForXInitializer 
    var valueXInitializer: String = i_valueXInitializer 

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent(fileName) 

    var dict: NSMutableDictionary = [keyForXInitializer: valueXInitializer] 

    //saving values 
    dict.setObject(valueToSave, forKey: keyForValueToSave) 

    //writing to plist 
    dict.writeToFile(path, atomically: false) 

    let resultDictionary = NSMutableDictionary(contentsOfFile: path) 
    println("Saved Data.plist file is --> \(resultDictionary?.description)") 
} 

И я называю это так:

saveObject("Selection.plist", "Item 0", "testConfig, "Item 3", "XInitializerItem_01") 

результат выглядит тогда так:

(http://s13.postimg.org/kbq103707/result.png) (жаль, что я не могу прикрепить любое изображение)

Как вы можете видеть, «testConfig», который должен быть сохранен в массив будет сохранен в виде обычной строки в файле pilst. Для меня это не цель. Каждый элемент, который я хотел бы добавить в этот массив. Im действительно новый в SWIFT и Im a, но застрял в космосе. Любая помощь будет замечательной! Спасибо!

ответ

0

Приведенный ниже код создает PLIST вам нужно, вы просто нужно правильно заполнить значения в соответствии с вашими потребностями

func saveObject(i_fileName: String, i_keyForValueToSave: String, i_valueToSave: String, i_keyForXInitializer:String, i_valueXInitializer: String) { 

    var fileName: String = i_fileName 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent(fileName) 

    var dict = NSMutableDictionary() 
    var item0 = [1,2,3] 
    var item1 = [1,2,3,4] 
    var item2 = false 
    var item3 = "xInitializerItem_01" 
    dict.setObject([item0, item1, item2, item3], forKey: "selection_01") 
    item0 = [4,5,6] 
    item1 = [5,6,7,8] 
    item2 = true 
    item3 = "xInitializerItem_02" 
    dict.setObject([item0, item1, item2, item3], forKey: "selection_02") 
    dict.writeToFile(path, atomically: true) 

    let resultDictionary = NSMutableDictionary(contentsOfFile: path) 
    println("Saved Data.plist file is --> \(resultDictionary?.description)") 
} 

То есть может быть результатом приведенного выше кода:

enter image description here

Вы не можете добавлять значения в PLIST, поэтому каждый раз, когда вы сохраните его необходимо сохранить все значения снова

+0

Он отлично работает спасибо для этого! Я также могу хранить данные в plist. Но действительно ли так, что plist не хранится в xcode, его хранится где-то глубоко в моей системе. Разработчик/CoreSimator/Devices ... И так далее. Данные заполняются там, но когда я хочу его прочитать, он берет данные из xcode, который, конечно, не заполняется ... – Andy

+0

Да просто введите значения, которые вы хотите ввести в переменных item0..item3, и это будет сохранено ,Этот файл не сохраняется в приложении, файлы plist, созданные в xcode, не могут быть изменены, а только читать, как только приложение установлено, файл сохраняется в папках вашего документа, чтобы ваше приложение могло его изменить, когда это необходимо. – Icaro

+0

ОК спасибо за разъяснительную работу. Только последний вопрос. Когда я хотел бы сохранить второй или третий массив (например, selecio _02 или selection_03) в тот же файл, как бы вы это сделали? Каждая попытка, которую я делал до сих пор, заключается в перезаписывании существующего массива ... Thx много времени! – Andy

0

Вы объявляете valueToSave как AnyObject но он держит i_valueToSave который объявлен как String в вашем параметре функции.

Итак, когда вы делаете dict.setObject(valueToSave, forKey: keyForValueToSave), это экономит String.

Вы должны объявить тип вашего параметра функции i_valueToSave в AnyObject вместо String, то внутри функции вы сможете бросить i_valueToSave к нужному типу перед его сохранением.

Скажем i_valueToSave массив строк, то:

if let valueToSave = i_valueToSave as? [String] { 
    dict.setObject(valueToSave, forKey: keyForValueToSave) 
} 

Если это NSArray:

if let valueToSave = i_valueToSave as? NSArray { 
    dict.setObject(valueToSave, forKey: keyForValueToSave) 
} 

Etc.