読者です 読者をやめる 読者になる 読者になる

tomoyaonishiのブログ

iOSのことを中心に・・・その他もあるよ!

Swift: NSUserDefaultsに配列が保存できない

Swiftでプライベートで開発中のアプリでこんな出来事に遭遇しました。

        let array = ["1", "2", "3", "4"]
        NSUserDefaults.standardUserDefaults().setObject(array, forKey: "key")
        NSUserDefaults.standardUserDefaults().synchronize()
  
        let array = NSUserDefaults.standardUserDefaults().arrayForKey("key") as? [String]
        println(array) // nil

NSUserDefaultsに配列が保存できないという罠にハマりました。 原因究明まで結構時間がかかりましたが、結論としては保存する配列を as NSArrayとすることです。 コードでは以下のようになります。

        let array = ["1", "2", "3", "4"] as NSArray // NSArrayにキャストする!
        NSUserDefaults.standardUserDefaults().setObject(array, forKey: "key")
        NSUserDefaults.standardUserDefaults().synchronize()
  
        let array = NSUserDefaults.standardUserDefaults().arrayForKey("key") as? [String]
        println(array) // Optional ["1", "2", "3", "4"] 

なぜこうなるのか理解できていません。Xcode6 beta6です。Swiftの配列はNSCodingを実装していないから?ネットで検索するとSwiftの配列も普通に保存できると書いてある記事もある。 でも確実に自分の環境ではNSArrayにキャストしないと保存できない。これは確実です。 もし、NSCodingを実装していないからだというなら、SwiftからiOS開発する人にはちょっと厳しすぎる仕様ですね。むしろSwiftになったせいでObjective-Cの開発でも意識しないようなFoundationのもっと深い知識が各所で要求されるようになった気もしています。特にCoreFoundation系のAPIを使うときによく感じます。自分がまだ理解不足なだけだと思うのですが、CoreFoundation系を使っているとたまに変換したい型までもっていけないことがありますw(暗黙の型変換がないせいで)

この件に関してはバグかもしれないし、実際どうなのかはよくわかりません。