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ます。

第 3 に、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!ドキュメント ディレクトリが存在し、プロパティ リスト ファイルが予測可能な形式であるため、2 つの式は安全です。

于 2016-05-01T07:23:08.157 に答える