2017-01-07 13 views
-1

는 다음 사전 가정 :키 - 값 저장에서 사전 형식을 신속하게 지정하는 방법?

var example: [String: (identifier: String, regex: NSRegularExpression)] = ["test": (identifier: "example", regex: try! NSRegularExpression(pattern: "test", options: []))] 

을 다음과 같이 나는 그것을 저장할 :

let test: [String: (identifier: String, regex: NSRegularExpression)] = keyStore.dictionary(forKey: "ex") as! [String: (identifier: String, regex: NSRegularExpression)] 

내가 나타납니다

let keyStore = NSUbiquitousKeyValueStore.default() 
keyStore.set(example, forKey: "ex") 

내 문제는 내가하려고 할 때 액세스 할 수 있다는 것입니다 다음 오류 :

Unwrapped optional value

왜 이런가요?

+0

매우 이상한 사전입니다. 우선 Objective-C에 넘겨 줄 튜플을 사전에 저장할 수 없다. 왜 CGSizes를 사용하지 않습니까? – matt

+0

또한 NSUbiquitousKeyStore는 무엇입니까? NSUbiquitousKeyValueStore를 의미합니까? 그렇다면 실제 코드일까요? 실제 코드를 표시하지 않으면 도움이 어렵습니다. – matt

+0

더 일반적인 것으로 원래의 질문에서 변경되었습니다. 내 코드에서 Objective-C에 아무 것도 전달할 필요가 없다. –

답변

1

Objective-C NSDictionary가 필요한 Objective-C에 사전을 전달하려고합니다. Objective-C NSDictionary의 값으로 Swift 튜플을 저장할 수는 없습니다. 또한, NSUbiquitousKeyValueStore에 대한 규칙은 더욱 엄격합니다. NSDictionary 일뿐만 아니라 속성 목록 유형 만 사용할 수 있습니다. 이는 매우 제한적입니다. 당신은 여기에서 그것을 사용하기 위해에 NSValue에 CGSize를 포장하고있는 NSData 해당 아카이브 뭔가를 할 필요가있을 것이다 :

let sz = CGSize(width:10, height:20) 
    let val = NSValue(cgSize:sz) 
    let dat = NSKeyedArchiver.archivedData(withRootObject: val) 
    let example = ["test": dat] 

    let keyStore = NSUbiquitousKeyValueStore.default() 
    keyStore.set(example, forKey: "ex") 

다시 밖으로 값을 얻으려면, 그 과정을 역으로.

if let dict = keyStore.dictionary(forKey: "ex") { 
     if let ex = dict["test"] as? Data { 
      if let v = NSKeyedUnarchiver.unarchiveObject(with: ex) as? NSValue { 
       print(v.cgSizeValue) // (10.0, 20.0) 
      } 
     } 
    }