检查 属性 个列表

Check for Property List

我目前正在 XCode 7 上学习 Swift 2,并试图弄清楚如何测试 属性 列表是否可供读取。

我有一个方便的初始值设定项,但我想执行一个测试以查看 属性List 是否存在,否则只需创建一个空数组。

这是我的代码:

属性 列表创建和写入

let propertyList: NSArray = photoGrid.photos.map { [=11=].propertyListRepresentation() }

let path = NSSearchPathForDirectoriesInDomains(
    .DocumentDirectory, 
    .UserDomainMask, 
    true)[0] as NSString

let file = path.stringByAppendingPathComponent("data.plist")

propertyList.writeToFile(file, atomically: true)

便利初始化

convenience init(propertyList: NSArray) {
    self.init()

    // test if property list exists {
    self.photos = propertyList.map { (param: AnyObject) -> Photo in
        let pl = param as! NSDictionary
        let photo = Photo(propertyList: pl)
        return photo!
    }
    // } else {
    //    print("Property List does not exist... Created empty object array)
}

首先使用URL相关API获取文件URL

let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let fileURL = documentDirectoryURL.URLByAppendingPathComponent("data.plist")

其次,有一个 class NSPropertyListSerializationNSArray.

的隐式 属性 列表序列化更可取

第三,在 Swift 中使用原生集合类型而不是类型未指定的 Foundation classes。

这是一个 init 方法,它创建文件 URL,检查文件是否存在并将映射的 Photo 实例或空的 Photo 数组分配给实例变量.

init() {
  let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
  let fileURL = documentDirectoryURL.URLByAppendingPathComponent("data.plist")
  if let data = NSData(contentsOfURL:fileURL), propertyList = try! NSPropertyListSerialization.propertyListWithData(data, options: [], format: nil) as? [[String:AnyObject]] {
    self.photos = propertyList.map { Photo(propertyList: [=11=])! }
  } else {
    self.photos = [Photo]()
  }
}

两个 try! 表达式是安全的,因为文档目录存在并且 属性 列表文件具有可预测的格式。