2017-01-07 15 views
-1

は、次の辞書と仮定しますキー値ストアで辞書タイプを指定するには?

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

を、次のように私はそれを保存したい:

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

私の問題は、私はそれにアクセスしようとすることです:

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

私が受け取ります次のエラー:

Unwrapped optional value

これはなぜですか?

+0

これは非常に奇妙な辞書です。 1つ目は、Objective-Cに渡す予定の辞書にタプルを格納することができないということです。なぜCGSizesを使用していないのですか? – matt

+0

また、NSUbiquitousKeyStoreとは何ですか? NSUbiquitousKeyValueStoreを意味しますか?もしそうなら、あなたの本当のコードでさえそれはありますか?実際のコードを表示しないと、助けが難しいです。 – matt

+0

元の質問ではより一般的に変更されました。 Objective-Cにコードを渡す必要はありません。 –

答えて

1

辞書をObjective-Cに渡そうとしていますが、これにはObjective-C NSDictionaryが必要です。 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) 
      } 
     } 
    } 
関連する問題