-1

Пусть следующий словарь:Как задать тип словаря в хранилище ключей с помощью 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

Почему это?

+0

Это очень странный словарь. Во-первых, вы не можете хранить кортеж в словаре, который вы передадите Objective-C. Почему вы не используете CGSizes? – matt

+0

Также что такое NSUbiquitousKeyStore? Вы имеете в виду NSUbiquitousKeyValueStore? Если да, это даже ваш реальный код? Трудно помочь, если вы не показываете настоящий код. – matt

+0

В первоначальном вопросе он был изменен, чтобы сделать его более общим. Мне не нужно передавать ничего в Objective-C в моем коде. –

ответ

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) 
      } 
     } 
    } 
Смежные вопросы