Plistから辞書の配列を取得する次のコードを考えます。
let path = NSBundle.mainBundle().pathForResource("books", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path)
let books:Array = dict.objectForKey("Books") as Array<Dictionary<String, AnyObject>> //I hate how ugly and specific this is. There has got to be a better way??? Why can't I just say let books:Array = dict.objectForKey("Books")?
let rnd = Int(arc4random_uniform((UInt32(books.count))))
let bookData:Dictionary = books[rnd]
現在、個々の本の辞書にアクセスできません。
let title:String = bookData.objectForKey("title") //[String: AnyObject] does not have a member named 'objectForKey'
let title:String = bookData["title"] // (String, AnyObject) is not convertible to String
本のタイトルを見つける適切な方法は何ですか?
Beta 3の配列と辞書に新しい構文糖を使用できます。
let path = NSBundle.mainBundle().pathForResource("books", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path)
let books = dict.objectForKey("Books")! as [[String:AnyObject]]
bookData
にはそのままアクセスできます。自動型推論は機能するはずです...
let rnd = Int(arc4random_uniform((UInt32(books.count))))
let bookData = books[rnd]
AnyObject
として定義しているため、ブックディクショナリの各項目に明示的なタイプを配置します。
let title = bookData["title"]! as String
let numPages = bookData["pages"]! as Int
遅延編集
Nilの合体演算子??
nil値を確認し、次のような代替値を提供できます。
let title = (bookData["title"] as? String) ?? "untitled"
let numPages = (bookData["pages"] as? Int) ?? -1
Swift:
Dictionary
を使用する場合:
if let bookData = bookData{
if let keyUnwrapped = bookData["title"]{
title = keyUnwrapped.string
}
}