web-dev-qa-db-ja.com

Swiftでの辞書アクセス

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 

本のタイトルを見つける適切な方法は何ですか?

11
soleil

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
    
24
Benzi

Swift:

Dictionaryを使用する場合:

if let bookData = bookData{
   if let keyUnwrapped = bookData["title"]{
      title = keyUnwrapped.string
   }
}
2
Juan Boero