Проверьте список свойств

В настоящее время я изучаю 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! выражения безопасны, потому что каталог документов существует, а файл списка свойств имеет предсказуемый формат.

Другие вопросы по тегам