Основные данные Скалярная ошибка только на некоторых устройствах
В основном я тестировал iPhone 6, 6 и iPad. Просто попробовал свое приложение сегодня на симуляторе iPhone 5 и получил ошибку Core Data.
CoreData: error: свойство 'setId:' является скалярным типом в классе "AppName.EntityName", который не соответствует его скалярному типу свойств Entity. Динамически сгенерированные аксессоры не поддерживают неявное принуждение типа. Невозможно создать для него метод настройки
Теперь в моем приложении нет объекта "setId", но, конечно, объект имеет объект "ID", который устанавливается как int.
class Entity: NSManagedObject {
@NSManaged var id: Int
}
В модели Core Data тип атрибута установлен в Integer64. Это может быть моей проблемой, поскольку я выбрал это, не зная, что лучше. У меня есть другие атрибуты в модели и классе, но все они являются строками.
Ищем как исправление, так и объяснение, почему это происходит только на некоторых устройствах, поэтому я могу узнать!
Ответы
Ответ 1
Если тип Core Data является Integer 64, вы должны объявить свойство как Int64
(или позволить Xcode создать подкласс управляемого объекта).
Int
может быть 32 бит или 64 бит, в зависимости от архитектуры процессора.
В качестве альтернативы, определите свойство как NSNumber*
вместо скалярного свойства. Конечно, вы должны позаботиться о том, чтобы на 32-битной платформе значения не превышали диапазон Int
.
Ответ 2
В качестве альтернативы вы можете написать собственный метод setter/getter, который преобразует Int
в экземпляр NSNumber
и передает это значение в примитивном значении. Например:.
private(set) var publicId: Int {
get {
self.willAccessValueForKey("publicId")
let value = self.primitivePublicId.longValue
self.didAccessValueForKey("publicId")
return value
}
set {
self.willChangeValueForKey("publicId")
self.primitivePublicId = NSNumber(long: newValue)
self.didChangeValueForKey("publicId")
}
}
@NSManaged private var primitivePublicId: NSNumber