检查 属性 个列表
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 NSPropertyListSerialization
比 NSArray
.
的隐式 属性 列表序列化更可取
第三,在 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!
表达式是安全的,因为文档目录存在并且 属性 列表文件具有可预测的格式。
我目前正在 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 NSPropertyListSerialization
比 NSArray
.
第三,在 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!
表达式是安全的,因为文档目录存在并且 属性 列表文件具有可预测的格式。