2014-09-09 3 views
21

는 다음 테스트 코드가 I :에 println (DATA0)의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) 

    } 

출력을 무기 호입니다.

내 코드에 문제가 있습니까? Swift Dictionary는 현재 또는 최종 릴리스에서 속성 목록으로 간주됩니까?

답변

30

업데이트 스위프트 2, 엑스 코드 7 에 대한 : @atxe 눈치으로 NSUserDefaults 사전은 이제 [String, AnyObject]로 매핑됩니다. 이 가 키는 문자열이 될 수 사전 속성 목록이어야합니다

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

(기본 개체로하고 특히 목표 - C 방법을 선언 할 수 있도록하는 「경량 제네릭 "는 목표 - C의 결과이다 .))

한편

, 발 빠른 사전이 자동으로 가능하다면 브리지, 그래서 질문에서 원래의 코드는 다시 (작동합니다

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) 

원문 대답 스위프트 1.2 : 사용자 기본값은 NSDictionary 개체를 저장할 수 있습니다.

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

을 그리고 dictionaryForKey()는 선택 반환합니다, 그래서 당신은 선택적인 과제로 예를 들어 그것을 확인해야합니다 : 이러한 [NSObject : AnyObject]로 스위프트 에 매핑되는

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

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

바로 위에! 핵심은 명시 적으로 선언하는 것입니다 : var jo : [NSObject : AnyObject] 위에서 언급 한대로. – Sean

+0

또 다른 방법은 (어떤 이유로 든 선언을 명시 적으로 만들 수없는 경우) "as NSDictionary"를 사용하는 것입니다. userDefaults.setObject ((jo as NSDictionary), forKey : aKey) – winterized

+1

Swift 2.0에서는 NSUserDefault 사전이 매핑됩니다. as [String : AnyObject].실제로 Int (예 :)를 키로 사용하여 사전을 저장하려고하면 런타임에 실패합니다. Apple이 제공하는 사소한 메소드를 사용하는 것이 좋지만 런타임 오류를 안전하게 지원하고 피할 수있는 강력한 유형의 메소드로 확장을 정의 할 수 있습니다. – atxe

10

먼저 NSData으로 변환해야합니다. 이런 식으로 뭔가 :

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

어제이 문제에 직면 레이더를 신청했다 : Cannot store Dictionary in NSUserDefaults in iOS8. 이 문제는 iOS 8과 관련이 있습니다. 또한이 경우에 대한 해결 방법을 설명했습니다 : Workaround for saving dictionary in 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] 
+3

"NSUserDefaults에 사전 저장 문제 해결"링크가 깨졌습니다. –

1

// 빠른 4.0

//

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

을 저장하기위한 //위한

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

제 생각에 'userDefaults.synchronize()'를 호출하는 데는 거의 이유가 없습니다. – Johan

1

아래이 아름다운 규정을 따르 검색을 위해 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; 
} 
관련 문제