在 swift 2.1 中写入/读取 Plist

Write/ read Plist in swift 2.1

正在尝试将 addObject 保存到 plist 中的数组,但不知道该怎么做...

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>Location</key>
    <array>
        <string>test</string>
        <string>test2</string>
    </array>
    <key>UserID</key>
    <array>
        <string>use1</string>
        <string>user2</string>
    </array>
</dict>
</plist>

这是我用的:

从 Documents 目录读取 plist 工作正常.... 在我看来DidLoad

 guard
            let fileURL =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist")
            else { fatalError("Unable to get file") }

        let dict = NSDictionary(contentsOfURL: fileURL)
        locationArray = dict?.objectForKey("Location") as! NSMutableArray
        userIDArray = dict?.objectForKey("UserID") as! NSMutableArray

在我的保存函数中:

 guard
        let fileURL =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist")
        else { fatalError("Unable to get file") }

    let dict = NSMutableDictionary(contentsOfURL: fileURL)

    dict?.setObject(userDefaultLocationTextField.text!, forKey: "Location")
    dict?.writeToURL(fileURL, atomically: true)

但是我的plist里好像什么都没写...

谢谢。

这似乎对我有用: 你觉得这样对吗?

 guard
            let fileURL =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist")
            else { fatalError("Unable to get file") }

        let dict = NSMutableDictionary(contentsOfURL: fileURL)
        locationArray = dict?.objectForKey("Location") as! NSMutableArray
        locationArray.addObject(userDefaultLocationTextField.text!)


        dict?.setObject(locationArray, forKey: "Location")
        dict?.writeToURL(fileURL, atomically: true)
        print(dict)

而不是简单的 NSDictionary(contentsOfURL: fileURL) 我建议使用 NSPropertyListSerialization class。

由于Swift的值类型语义,您需要在更改其中一个数组后更新根字典,例如

guard
  let fileURL =  NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist"),
  fileData = NSData(contentsOfURL: fileURL)
  else { fatalError("Unable to get file") }

do {
  var dict = try NSPropertyListSerialization.propertyListWithData(fileData, options: .MutableContainersAndLeaves, format: nil) as! [String:AnyObject]

  var locationArray = dict["Location"] as! [String]
  locationArray.append(userDefaultLocationTextField.text!)
  dict["Location"] = locationArray // this line is crucial to update the enclosing dictionary

  let outputData = try NSPropertyListSerialization.dataWithPropertyList(dict, format: NSPropertyListFormat.XMLFormat_v1_0, options: 0)
  try outputData.writeToURL(fileURL, options: .AtomicWrite)
} catch let error as NSError {
  print(error)
}