Posted at

Swiftで配列をNSUserDefaultsを使って保存・読み込み

More than 5 years have passed since last update.


Objective-Cとの大きな違い

Objective-Cでは、UserDefaultsで配列を保存した場合でも、保存と読み込みが1行で済む簡単なお仕事でした。

しかし、Swiftでは、型推定が実装されているため、配列の中身は何じゃろな?状態(AnyObject)では格納できませんよーというErrorではじかれてしまいました。

そこで、試行錯誤の末に解決できた方法を今回は紹介します。


NSUserDefaultsでの配列の保存

まずは配列の生成をする


Swift

//配列を生成

var names:[String] = ["カネキ", "トーカ", "リゼ", "ニシキ"]

//空の配列ならこのように生成
var names: [String] = []


次にNSUserDefaultsで保存してみる

保存はObjective-Cと同じように使える


Swift

//NSUserDefaultsのインスタンスを生成

let defaults = NSUserDefaults.standardUserDefaults()

//"NAME"というキーで配列namesを保存
defaults.setObject(names, forKey:"NAME")

// シンクロを入れないとうまく動作しないときがあります
defaults.synchronize()



NSUserDefaultsでの配列の読み込み

そして、ここからが本題

これが大変でした

ちなみに、あんまり美しい書き方ではなさそうなので、もっと良い書き方あるよ!って方は教えてください


Swift

//空の配列を用意

var names: [String] = []

//前回の保存内容があるかどうかを判定
if(defaults.objectForKey("NAME")){

//objectsを配列として確定させ、前回の保存内容を格納
let objects = defaults.objectForKey("NAME") as? NSArray

//各名前を格納するための変数を宣言
var nameString:AnyObject

//前回の保存内容が格納された配列の中身を一つずつ取り出す
for nameString in objects!{
//配列に追加していく
names.append(nameString as NSString)
}
}