web-dev-qa-db-ja.com

Swift NSUserDefaultsは辞書を保存しませんか?

次のテストコードがあります。

  func testSaveDictionary() {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    var jo = [
      "a" : "1.0",
      "b" : "2.0"
    ]

    let akey = "aKey"
    userDefaults.setObject(jo, forKey: akey)
    var isOk = userDefaults.synchronize()

    var data0 = userDefaults.dictionaryForKey(akey)
    println(data0)

  }

Println(data0)の出力はnilです。

私のコードに何か問題がありますか? Swift辞書は現在、または最終リリースでプロパティリストと見なされますか?

22
Sean

Swift 2、Xcode 7:の更新@atxeが気づいたように、NSUserDefaults辞書は_[String, AnyObject]_としてマップされるようになりました。これは、Objective-Cメソッドを次のように宣言できるObjective-Cの「軽量ジェネリック」の結果です。

_- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName
_

(デフォルトのオブジェクトはプロパティリストである必要があり、特に辞書キーは文字列のみです。)

一方、Swift辞書は可能であれば自動的にブリッジされるため、質問の元のコードは(再び)動作します:

_let jo = [
    "a" : "1.0",
    "b" : "2.0"
]

let akey = "aKey"
// Swift 2:
userDefaults.setObject(jo, forKey: akey)
// Swift 3:
userDefaults.set(jo, forKey: akey)
_

Swift 1.2:の元の答えユーザーのデフォルトでは、NSDictionaryオブジェクトを保存できます。これらはSwift as _[NSObject : AnyObject]_としてマップされます:

_var jo : [NSObject : AnyObject] = [
    "a" : "1.0",
    "b" : "2.0"
] 
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()
_

dictionaryForKey()はオプションを返すため、たとえばオプションの割り当てを使用してチェックする必要があります。

_if let data0 = userDefaults.dictionaryForKey(akey) {
    print(data0)
} else {
    print("not set")
}

// Output: [b: 2.0, a: 1.0]
_
31
Martin R

最初にNSDataに変換する必要があります。このようなもの:

var data = NSKeyedArchiver.archivedDataWithRootObject(jo)
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(data, forKey:akey) 
12
Anthony Kong

昨日この問題に直面し、レーダーを提出しました: iOS8のNSUserDefaultsに辞書を保存できません 。この問題はiOS 8のみに関連しています。また、この場合の回避策について説明しました: NSUserDefaultsに辞書を保存するための回避策 。魅力のように機能します。

/// Save
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(object), forKey: key)

/// Read
var data = NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData
var object = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [String: String]
4
Tomasz Szulc

以下のこの美しいコードに従ってください-> Swift 3

public func setDict(dict: NSDictionary) {
    let data = NSKeyedArchiver.archivedData(withRootObject: dict)
    let userDefaults = UserDefaults.standard
    userDefaults.set(data, forKey:"keyHere")
}


public func getDict() -> NSDictionary {
    let data = UserDefaults.standard.object(forKey: "keyHere") as! NSData
    let object = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as! NSDictionary
    return object;
}
3

// Swift 4.

//保存用

    let userDefaults = UserDefaults.standard
    userDefaults.setValue(value, forKey: "Your_Key")
    userDefaults.synchronize()

//取得用

        let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key")
2
Shashi Verma