2014-12-16 2 views
2

Я пытаюсь понять, как сохранить простое значение, целое число, в plist. , но я нахожу в сети только решение для сохранения словаря и массива, и я не понимаю, что я могу изменить, чтобы работать с ним только для целого числа. это код на данный момент ...Напишите и прочитайте plist в swift с простыми данными

var musicalChoice = 1 
var musicString : String = "5" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    musicString = String(musicalChoice)} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func writePlist() { 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as NSString 
    let path = documentsDirectory.stringByAppendingPathComponent("Preferences.plist") 
    musicString.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error:nil) 
} 

func readPlist() { 

} 
+0

Возможный дубликат [Сохранить данные в .plist файле в Swift] (http://stackoverflow.com/questions/25100262/save-data-to-plist-file-in-swift) – bmike

ответ

6

Обновление для Swift 4

Я создал SwiftyPlistManager. Посмотрите на него на GiHub и следовать этим видео инструкции:

YouTube Documentation

https://www.youtube.com/playlist?list=PL_csAAO9PQ8bKg79CX5PEfn886SMMDj3j

Обновление для Swift 3,1

let BedroomFloorKey = "BedroomFloor" 
let BedroomWallKey = "BedroomWall" 
var bedroomFloorID: Any = 101 
var bedroomWallID: Any = 101 

func loadGameData() { 

    // getting path to GameData.plist 
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray 
    let documentsDirectory = paths.object(at: 0) as! NSString 
    let path = documentsDirectory.appendingPathComponent("GameData.plist") 

    let fileManager = FileManager.default 

    //check if file exists 
    if !fileManager.fileExists(atPath: path) { 

    guard let bundlePath = Bundle.main.path(forResource: "GameData", ofType: "plist") else { return } 

    do { 
     try fileManager.copyItem(atPath: bundlePath, toPath: path) 
    } catch let error as NSError { 
     print("Unable to copy file. ERROR: \(error.localizedDescription)") 
    } 
    } 

    let resultDictionary = NSMutableDictionary(contentsOfFile: path) 
    print("Loaded GameData.plist file is --> \(resultDictionary?.description ?? "")") 

    let myDict = NSDictionary(contentsOfFile: path) 

    if let dict = myDict { 
    //loading values 
    bedroomFloorID = dict.object(forKey: BedroomFloorKey)! 
    bedroomWallID = dict.object(forKey: BedroomWallKey)! 
    //... 
    } else { 
    print("WARNING: Couldn't create dictionary from GameData.plist! Default values will be used!") 
    } 
} 

func saveGameData() { 

    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray 
    let documentsDirectory = paths.object(at: 0) as! NSString 
    let path = documentsDirectory.appendingPathComponent("GameData.plist") 

    let dict: NSMutableDictionary = ["XInitializerItem": "DoNotEverChangeMe"] 
    //saving values 
    dict.setObject(bedroomFloorID, forKey: BedroomFloorKey as NSCopying) 
    dict.setObject(bedroomWallID, forKey: BedroomWallKey as NSCopying) 
    //... 

    //writing to GameData.plist 
    dict.write(toFile: path, atomically: false) 

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

Вот что я использую для чтения/записи plist файл в быстром режиме:

let BedroomFloorKey = "BedroomFloor" 
let BedroomWallKey = "BedroomWall" 
var bedroomFloorID: AnyObject = 101 
var bedroomWallID: AnyObject = 101 

func loadGameData() { 

// getting path to GameData.plist 
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
let documentsDirectory = paths[0] as String 
let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist") 

let fileManager = NSFileManager.defaultManager() 

//check if file exists 
if(!fileManager.fileExistsAtPath(path)) { 
    // If it doesn't, copy it from the default file in the Bundle 
    if let bundlePath = NSBundle.mainBundle().pathForResource("GameData", ofType: "plist") { 

    let resultDictionary = NSMutableDictionary(contentsOfFile: bundlePath) 
    println("Bundle GameData.plist file is --> \(resultDictionary?.description)") 

    fileManager.copyItemAtPath(bundlePath, toPath: path, error: nil) 
    println("copy") 
    } else { 
    println("GameData.plist not found. Please, make sure it is part of the bundle.") 
    } 
} else { 
    println("GameData.plist already exits at path.") 
    // use this to delete file from documents directory 
    //fileManager.removeItemAtPath(path, error: nil) 
} 

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

var myDict = NSDictionary(contentsOfFile: path) 

if let dict = myDict { 
    //loading values 
    bedroomFloorID = dict.objectForKey(BedroomFloorKey)! 
    bedroomWallID = dict.objectForKey(BedroomWallKey)! 
    //... 
} else { 
    println("WARNING: Couldn't create dictionary from GameData.plist! Default values will be used!") 
} 
} 

func saveGameData() { 

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
let documentsDirectory = paths.objectAtIndex(0) as NSString 
let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist") 

var dict: NSMutableDictionary = ["XInitializerItem": "DoNotEverChangeMe"] 
//saving values 
dict.setObject(bedroomFloorID, forKey: BedroomFloorKey) 
dict.setObject(bedroomWallID, forKey: BedroomWallKey) 
//... 

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

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

PLIST файл следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>BedroomFloor</key> 
    <integer>101</integer> 
    <key>BedroomWall</key> 
    <integer>101</integer> 
    <key>XInitializerItem</key> 
    <string>DoNotEverChangeMe</string> 
</dict> 
</plist> 
2

Вы не можете иметь ничего, кроме массива или словаря в качестве корневого объекта в PLIST. Это связано с тем, что файлы plist являются по существу специальными файлами xml, поэтому, когда вы пытаетесь прочитать файл, который вы запрашиваете для объекта по ключу или объекту по индексу, в противном случае у вас нет средств для получения ваших данных. Кроме того, при вставке чисел в plist вы должны обернуть их в класс NSNumber. Чтобы сохранить свои объекты, ознакомьтесь с этим answer.

1

Мой вариант функции для чтения и записи .plist на скор, испытано на устройстве.

Exapmle:
вар dataVersion = readPlist ("Параметры", клавиша: "dataVersion")
writePlist ("Параметры", клавиша: "dataVersion", данные: 1,23)

Функция:

func readPlist(namePlist: String, key: String) -> AnyObject{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent(namePlist+".plist") 

    var output:AnyObject = false 

    if let dict = NSMutableDictionary(contentsOfFile: path){ 
     output = dict.objectForKey(key)! 
    }else{ 
     if let privPath = NSBundle.mainBundle().pathForResource(namePlist, ofType: "plist"){ 
      if let dict = NSMutableDictionary(contentsOfFile: privPath){ 
       output = dict.objectForKey(key)! 
      }else{ 
       output = false 
       println("error_read") 
      } 
     }else{ 
      output = false 
      println("error_read") 
     } 
    } 
    return output 
} 
func writePlist(namePlist: String, key: String, data: AnyObject){ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let documentsDirectory = paths.objectAtIndex(0) as! NSString 
    let path = documentsDirectory.stringByAppendingPathComponent(namePlist+".plist") 

    if let dict = NSMutableDictionary(contentsOfFile: path){ 
     dict.setObject(data, forKey: key) 
     if dict.writeToFile(path, atomically: true){ 
      println("plist_write") 
     }else{ 
      println("plist_write_error") 
     } 
    }else{ 
     if let privPath = NSBundle.mainBundle().pathForResource(namePlist, ofType: "plist"){ 
      if let dict = NSMutableDictionary(contentsOfFile: privPath){ 
       dict.setObject(data, forKey: key) 
       if dict.writeToFile(path, atomically: true){ 
        println("plist_write") 
       }else{ 
        println("plist_write_error") 
       } 
      }else{ 
       println("plist_write") 
      } 
     }else{ 
      println("error_find_plist") 
     } 
    } 
} 
Смежные вопросы