2015-06-18 2 views
1

Не NSValue NSObject? Так почему же я врезаться наSwift NSCoding с NSValue

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

Error Вход

*** 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 работают нормально.

+0

Я считаю, что это связано с тем, что ключевой архиватор не может получить ключи для записей структуры. Альтернативой является использование NSArchiver, который может работать для вас, за счет меньшей гибкости. Или не используйте структуру и сохраняйте отдельные поля или создайте свой собственный объект, который поддерживает NSCoding. –

+0

Я предположил, что NSValue был похож на Wrapper, я мог бы вложить этот Struct и быть золотым. Угадайте, у меня есть рабочая работа, но это было бы чище. – DogCoffee

+1

Мне кажется, что NSValue (MKCoordinate :) сломан. Вы должны указать отчет об ошибке. – matt

ответ

1

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

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

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

+0

работает для меня, вы пропускаете импорт? – DogCoffee

+0

Если бы я был, мы бы не собирались, не так ли? – matt

+0

Я просто положил его в свой viewDidLoad и запускал, давая NSValue <00000000 00003440 00000000 00003440> .... странность :-) – DogCoffee