-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)]

次のエラーが表示されます。

アンラップされたオプションの値

どうしてこれなの?

4

1 に答える 1

1

ディクショナリを Objective-C に渡しようとしていますが、これには Objective-C NSDictionary が必要です。ただし、Swift タプルを Objective-C NSDictionary の値として格納することはできません。さらに、NSUbiquitousKeyValueStore のルールはさらに厳格です。これは NSDictionary である必要があるだけでなく、非常に制限されたプロパティ リストタイプしか使用できません。ここで使用するには、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)
            }
        }
    }
于 2017-01-07T18:26:12.567 に答える