Как представить словарь как NSValue в Swift 3?

У меня есть следующий словарь:

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

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

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

Только чтобы встретить ошибку:

Невозможно преобразовать значение типа «Void» (он же «()») в указанный тип «NSValue».

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

let test = UnsafeMutablePointer.load(example)

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

Тип «UnsafeMutablePointer‹_>» не имеет элемента «load»

Итак, как же преобразовать словарь в NSValue в Swift 3?


person Brandon Bradley    schedule 08.01.2017    source источник


Ответы (2)


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

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
}

вот наоборот:

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

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

Осторожно: это путь на темную сторону.

person Joe Daniels    schedule 08.01.2017

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

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

person Joe Daniels    schedule 08.01.2017
comment
Итак, нет ли абсолютно никакого способа сохранить кортеж в NSUbiquitousKeyValueStore? - person Brandon Bradley; 08.01.2017
comment
Пример кода слишком длинный, см. второй ответ - person Joe Daniels; 08.01.2017