Swift 如何在键值存储中指定字典类型?
How to Specify Dictionary Type in Key-Value Store with Swift?
假设以下字典:
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
这是为什么?
您正在尝试将您的词典交给 Objective-C,这需要一个 Objective-C NSDictionary;但是您不能将 Swift 元组作为值存储在 Objective-C NSDictionary 中。而且,NSUbiquitousKeyValueStore 的规则更加严格:它不仅必须是 NSDictionary,而且只能使用 属性 list 类型,这是非常有限的。您需要做一些事情,例如将 CGSize 包装在 NSValue 中并将其存档到 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)
}
}
}
假设以下字典:
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
这是为什么?
您正在尝试将您的词典交给 Objective-C,这需要一个 Objective-C NSDictionary;但是您不能将 Swift 元组作为值存储在 Objective-C NSDictionary 中。而且,NSUbiquitousKeyValueStore 的规则更加严格:它不仅必须是 NSDictionary,而且只能使用 属性 list 类型,这是非常有限的。您需要做一些事情,例如将 CGSize 包装在 NSValue 中并将其存档到 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)
}
}
}