技術ブログ

プログラミング、IT関連の記事中心

UserDefaultsに配列・辞書を設定【Swift】

■はじめに

UserDefaultsを使用していると、物足りなくなってきませんか?
objective-cでは、簡単に保存できていた配列などがSwiftでは一手間が必要になります。

Swiftで配列などの複雑な型をUserDefaultsに保存する方法として色々方法はありますが、ここでは
UserDefaultsを拡張(extension)して保存、取得する方法を記載します。

◾️String配列

String型の配列を保存、取得が出来るように拡張します。
他の方の配列を保存、取得したい場合には、型を書き換えるだけです!

拡張方法は、以下です。

extension UserDefaults {
    /**
     * UserDefaultsに配列を設定できる様に拡張
     *
     * @param targetArray [String] 設定するString型配列を渡す
     * @param key String Userdefaultsのキーを渡す
     */
    func setHairetu(_ targetArray: [String], _ key: String) {
        set(targetArray, forKey: key)
    }
    
    /**
     * UserDefaultsから配列を取得できる様に拡張
     *
     * @param key String Userdefaultsのキーを渡す
     * @return [String]? 対象のキーにString型配列がある場合には、その配列を返す。
     * ない場合には、nilを返す。
     */
    func getHairetu(_ key: String) -> [String]? {
        guard let areas = object(forKey: key) as? [String] else { return nil }
        return areas
    }
}

実際に、保存、取得する方法は以下です。

// 配列を保存する方法
let hairetu = ["1", "2"]
UserDefaults.standard.setHairetu(hairetu, "Key")

// 配列を取得する方法
UserDefaults.standard.getHairetu("Key")

すごく簡単ですね!
一度拡張してしまえば、以降はこのように簡単に使用できるのでオススメです。

◾️辞書の配列

今度は、より複雑な「辞書型」のデータを配列で持つ場合の拡張を記載します。
ほとんど配列と同じ方法ですが。。。

そもそも、辞書型の配列とは、以下のようなデータのことです。

var dic1: Array<[String: String]> = [
    ["one" : "aa", "two" : "bb"],
    ["three" : "cc", "fo" : "dd"]
]

このデータを拡張する方法は、以下です。

extension UserDefaults {
    /**
     * UserDefaultsに辞書型を格納する配列を設定できる様に拡張
     *
     * @param targetArray Array<[String: String]> 設定する辞書を格納した配列を渡す
     * @param key String Userdefaultsのキーを渡す
     */
    func setArray(_ targetArray: Array<[String: String]>, _ key: String) {
        set(targetArray, forKey: key)
    }
    
    /**
     * UserDefaultsから辞書型を格納した配列を取得できる様に拡張
     *
     * @param key String Userdefaultsのキーを渡す
     * @return Array<[String: String]>? 対象のキーに辞書型を格納した配列がある場合には、その配列を返す。
     * ない場合には、nilを返す。
     */
    func getArray(_ key: String) -> Array<[String: String]>? {
        guard let areas = object(forKey: key) as? Array<[String: String]> else { return nil }
        return areas
    }
}

取得、保存する方法は以下です。

// 辞書方の配列を保存する方法
var dic1: Array<[String: String]> = [
    ["one" : "aa", "two" : "bb"],
    ["three" : "cc", "fo" : "dd"]
]
UserDefaults.standard.setArray(dic1, "Key")

// 辞書方の配列を取得する方法
UserDefaults.standard.getArray("Key")