Проверьте список свойств
В настоящее время я изучаю Swift 2 на XCode 7 и пытаюсь выяснить, как проверить, доступен ли список свойств для чтения.
У меня есть удобный инициализатор, который работает, но я хочу реализовать тест, чтобы увидеть, существует ли 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)
}
1 ответ
Прежде всего используйте API, связанный с URL, чтобы получить 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!
выражения безопасны, потому что каталог документов существует, а файл списка свойств имеет предсказуемый формат.