2015-01-21 3 views
4

Когда я создал объекты NSManagedObjects, я использовал свойства Scalar. Такие, как:Скалярные свойства не работают, кроме исходного хранилища

@objc(Candy) 
class Candy: DefaultDeserializableManagedObject { 
    @NSManaged var id: Int 
    @NSManaged var name: String 
    @NSManaged var smallImageUrl: String 
    @NSManaged var largeImageUrl: String 
    @NSManaged var price: Int 
    @NSManaged var sortOrder: Int 
} 

Я сделал это, потому что я не хочу, чтобы пройти второй ссылке, чтобы получить пригодные для использования примитивов (напр self.sortOrder.intValue.). Все отлично поработало, и я даже могу использовать SwiftyJSON и setValue:forKey: для десериализации, что было очень приятно.

К сожалению, все работает только в исходном репозитории. Я не поймал этого, пока не помог кто-то другой настроить. Даже если я повторно клонируюсь на том же компьютере, что и рабочий репозиторий, и попытаюсь его настроить, все не работает. При попытке получить значение примитивов, я получаю:

2015-01-21 10:45:48.372 [5355:178924] CoreData: error: Property 'id' is a scalar type on class 'Candy' that does not match its Entity's property's scalar type. Dynamically generated accessors do not support implicit type coercion. Cannot generate a getter method for it.

2015-01-21 10:45:48.373 [5355:178924] -[Candy id]: unrecognized selector sent to instance 0x79ea3df0

Моего .gitignore выглядит следующим образом, я не верю, что есть что-либо конкретное ядро-данные, которые будут игнорироваться в этом случае:

build/ 
*.pbxuser 
!default.pbxuser 
*.mode1v3 
!default.mode1v3 
*.mode2v3 
!default.mode2v3 
*.perspectivev3 
!default.perspectivev3 
xcuserdata 
*.xccheckout 
*.moved-aside 
DerivedData 
*.hmap 
*.ipa 
*.xcuserstate 

Я попробовал сбросить свой симулятор для рабочего репозитория и переустановить его, и он все еще работает. То же самое для очистки перед зданием.

+0

Мне никогда не удавалось получать скалярные типы, работающие с быстрыми NSManagedObjects, не говоря уже о таинственной загадке. Мне будет интересно увидеть ответ на этот вопрос – jrturton

+0

Я не понял, почему ваша проблема связана с клонированием репозитория, но скалярные свойства должны иметь тип Int16, Int32 или Int64, в зависимости от того, как вы определили атрибут Core Data (Integer 16/32/64). –

+0

Моя причина упоминания клонирования (и моего '.gitignore') заключается в том, что мне интересно, есть ли какой-либо пользовательский префикс - или что-то, что отсутствует в управлении версиями, - это направление Core Data для поиска скаляров, а не объекты. Я знаю, что это кажется асинским, но это буквально единственное, что было бы иначе. – cscott530

ответ

2

Он будет работать на устройствах с 64-разрядной версией и не будет работать на устройствах, которые 32 бит.

У нас была эта проблема, и в модели CoreData атрибут был установлен в Int64. В Swift, когда у вас есть:

@NSManaged var id: Int 

Он пытается автоматически преобразовывать скаляр. Он работает на 64-битных устройствах, поскольку он преобразует Int64 в Int (который составляет 64 бит). Он не работает на 32-разрядных устройствах, поскольку он не может преобразовать Int64 в Int (который составляет 32 бит).

Либо измените Int на Int64, либо измените его на NSNumber.

Смежные вопросы