Быстрое NSCoding с NSValue

Разве NSValue не является NSObject? Так почему я терплю крах

    var coordinatesRawData = NSValue(MKCoordinate: coordinates.first!)
    if coordinatesRawData != nil {
        // Crashing here. I have a valid NSValue object
        aCoder.encodeObject(coordinatesRawData, forKey: "coordinatesRawData")
    }

Журнал ошибок

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'

Но если я сделаю это

    var coordinatesRawData = NSValue()
    aCoder.encodeObject(coordinatesRawData, forKey: "coordinatesRawData")

Нет никакого сбоя - оба являются NSValues ​​.. верно?

Обратите внимание, что все остальные мои NSCoding/Decoding работают нормально.


person DogCoffee    schedule 18.06.2015    source источник
comment
Я считаю, что это связано с тем, что архиватор с ключами не может получить ключи для записей структуры. В качестве альтернативы вы можете использовать NSArchiver, который может работать на вас за счет меньшей гибкости. Или не используйте структуру и храните отдельные поля или создавайте свой собственный объект, который поддерживает NSCoding.   -  person Rory McKinnel    schedule 19.06.2015
comment
Я предполагал, что NSValue похож на Wrapper, я мог добавить эту структуру и быть золотым. Думаю, нет, у меня есть работа, но это было бы чище.   -  person DogCoffee    schedule 19.06.2015
comment
Мне кажется, что NSValue(MKCoordinate:) не работает. Вы должны подать отчет об ошибке по этому поводу.   -  person matt    schedule 19.06.2015
comment
Это вторая ошибка, которую я обнаружил за короткий промежуток времени. stackoverflow.com/questions/30158193 / Я согласен, что это ошибка.   -  person DogCoffee    schedule 19.06.2015


Ответы (1)


Я даже не зашел так далеко, как ты. Я разбился только на этих двух строках:

let loc = CLLocationCoordinate2D(latitude: 20, longitude: 20)
let val = NSValue(MKCoordinate:loc)

Это говорит мне, что NSValue(MKCoordinate:) не работает. И это не проблема Swift; Я получаю тот же сбой, используя тот же код, переведенный на Objective-C.

person matt    schedule 18.06.2015
comment
Если бы я был, мы бы не компилировались, не так ли? - person matt; 19.06.2015
comment
Я просто помещаю его в свой viewDidLoad и запускаю, давая NSValue ‹00000000 00003440 00000000 00003440› .... странность :-) - person DogCoffee; 19.06.2015
comment
Да, я тоже видел это на другом пробеге. - person matt; 19.06.2015
comment
Этот <00000000 00003440 00000000 00003440> является loc. Это говорит вам, что мы не получаем объект NSValue — мы просто получаем исходную структуру. И это объясняет ваш сбой. NSValue не может обернуть структуру, как предполагалось. - person matt; 19.06.2015
comment
Я только что попробовал это в iOS 9. Мы все еще вылетаем с NSValue(MKCoordinate:CLLocationCoordinate2DMake(1,2)). Я тоже регистрирую ошибку. - person matt; 19.06.2015