2014-09-09 28 views
21

Aşağıdaki test kodu sahiptir: println (DATA0) arasındaSwift NSUserDefaults, Dictionary'i kaydetmiyor mu?

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) 

    } 

çıkış sıfırdır.

Kodumda sorun mu var? Swift Dictionary şimdi veya son sürümde emlak listesini mi değerlendiriyor?

cevap

30

Güncelleme Swift 2, Xcode 7 için: @atxe fark gibi, NSUserDefaults sözlükleri şimdi [String, AnyObject] olarak eşlenir. Bu anahtarları yalnızca dizeleri olabilir sözlüğe mülkiyet listeleri olmalıdır

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

(Varsayılan nesneler olarak ve özellikle Objective-C yöntem bildirmek için izin "hafif jenerik" Objective-C bir sonucudur .))

Öte yandan

, bir Swift Sözlük otomatik mümkünse köprülü, bu nedenle söz orijinal kod tekrar (çalışır:

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) 

için orijinal cevap Swift 1.2: Kullanıcı varsayılanları NSDictionary nesnelerini kaydedebilir.

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

Ve dictionaryForKey() opsiyonel döndüren unutmayın, bu nedenle isteğe bağlı atama ile örneğin kontrol etmelidir: Bunlar [NSObject : AnyObject] olarak Swift eşlenir

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

// Output: [b: 2.0, a: 1.0] 
+2

doğru! Anahtar açık bir şekilde beyan etmektir: var jo: [NSObject: AnyObject] yukarıda belirttiğiniz gibi. – Sean

+0

Başka bir şekilde (bir sebepten dolayı bildirimi açıklayamazsanız) "NSDictionary olarak" kullanmak olacaktır: userDefaults.setObject ((NSDictionary olarak jo), forKey: aKey) – winterized

+1

Swift 2.0'da NSUserDefault sözlükleri eşleştirilir olarak [String: AnyObject].Aslında bir Sözlükü Int (örneğin) anahtar olarak kaydetmeye çalışırsanız, çalışma zamanında başarısız olur. Apple tarafından sağlanan böylesine basit bir yönteme sahip olmak güzel olsa da, olası bir çalışma zamanı hatasını güvenli bir şekilde desteklemek ve bunlardan kaçınmak için uzantınızı güçlü bir yazım yöntemiyle tanımlayabilirsiniz. – atxe

10

Önce onu NSData şeklinde dönüştürmeniz gerekir. Böyle bir şey:

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

dün bu sorunla karşı karşıya ve radar: Cannot store Dictionary in NSUserDefaults in iOS8. Bu sorun yalnızca iOS 8 ile ilgilidir. Ayrıca bu durum için bir çözüm açıkladım: Workaround for saving dictionary in NSUserDefaults. ÇALIŞIYOR bir cazibe gibi. > Swift -

/// 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] 
+3

Bağlantı "NSUserDefaults öğesinde sözlüğü kaydetmek için geçici çözüm" bozuk –

1

// hızlı 4,0

//

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

kaydetmek için // için

 let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key") 
+0

Benim anlayışa göre userDefaults.synchronize() 'çağırmak için çok az neden var. – Johan

1

altında bu güzel yasalara uyun almak için 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; 
}