0

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

我有一个方便的初始化程序,但我想实现一个测试以查看 propertyList 是否存在,否则只需创建一个空数组。

这是我的代码:

属性列表的创建和写入

let propertyList: NSArray = photoGrid.photos.map { $0.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)
}
4

1 回答 1

1

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

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

其次,有一个类比.NSPropertyListSerialization的隐式属性列表序列化更可取NSArray

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

这是一种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: $0)! }
  } else {
    self.photos = [Photo]()
  }
}

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

于 2016-05-01T07:23:08.157 回答