0

У меня есть следующий словарь:Как представлять словарь как NSValue в Swift 3?

let example: [String: (Int, Int)] = ["test": (0, 1)] 

Мне нужно хранить это в качестве переменной NSData, и сделать это он должен сначала быть преобразованы в NSValue, который я пытаюсь сделать следующее:

let nsval = NSValue().getValue(example as! UnsafeMutableRawPointer) 

только должны быть выполнены с ошибкой:

Cannot convert value of type 'Void' (aka '()') to specified type 'NSValue'

Я видел SO ответы, которые предлагают использовать:

let test = UnsafeMutablePointer.load(example) 

Но это также приводит к ошибке:

Type 'UnsafeMutablePointer<_>' has no member 'load'

Итак, как один, чтобы преобразовать словарь к NSValue в Swift 3?

ответ

1

Теоретически, если вы действительно хотите превратить быстрый кортеж в объект данных, вы можете это сделать.

var x:(Int, Int) = (4, 2) 

var bytes:Data = withUnsafeBytes(of: &x){ g in 
    var d = Data() 
    for x in g { 
     d.append(x) 
    } 

    return d 
} 

Heres обратное:

var y:(Int, Int) = (0,0) 
bytes.withUnsafeBytes { (x:UnsafePointer<(Int, Int)>) in 
    y = x.pointee 
} 

print(y) // prints (4, 2) 

Осторожно: это путь к темной стороне.

2

не все быстрые типы совместимы с классами Foundation. Таким образом, вы не можете построить NSValue, содержащий тип [String: (Int, Int)], но можете начать с NSDictionary. Выровняйте кортеж и выберите тип, совместимый с objc. то вы можете изменить тип let example: на NSDictionary. используйте это с помощью методов NSValue.

Это говорит, что если вы пытаетесь превратить общие ObjC типов в NSData для общих целей сериализации, вы собираетесь получить больше пробега из NSKeyedArchiver/NSKeyedUnarchiver методы как .archivedData(withRootObject: Any) -> Data (хотя они до сих пор не поддерживают кортежи.)

+0

Итак, не существует ли способа хранить кортеж в NSUbiquitousKeyValueStore? –

+0

Пример кода слишком длинный, см. Второй ответ –