使用简单数据快速写入和读取plist [英] Write and Read a plist in swift with simple data

查看:85
本文介绍了使用简单数据快速写入和读取plist的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解如何在plist中保存一个简单值(整数). 但是我在网上找到关于保存字典和数组的唯一解决方案,但我不明白我可以更改为仅对整数工作的解决方案. 这是目前的代码...

i'm trying to understand how to save a simple value, an integer, in a plist. but i'm finding on the net only solution for save dictionary and array and i don't understand what i can change to work it only for an integer. this is the code for the moment...

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() {

}

推荐答案

针对Swift 4的更新

我已经创建了SwiftyPlistManager.在GiHub上观看它,并按照以下视频说明进行操作:

I have created SwiftyPlistManager. Take a look at it on GiHub and follow these video instructions:

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

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文件是这样的:

The plist file is this:

<?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>

这篇关于使用简单数据快速写入和读取plist的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆