Обновите атрибут CoreData типа Int32
Я хотел бы получить значение основного атрибута данных, и после получения этого объекта / значения я хотел бы обновить его. Это мой код:
var numberOfChanges:Int32?
numberOfChanges = theme.valueForKey("numberThemeChanged") as Int32
var newValueThemeChanges:Int32?
newValueThemeChanges = numberOfChanges+1
theme.setValue(newValueThemeChanges, forKey: "numberThemeChanged")
Я получаю следующие ошибки:
Type 'Int32' does not conform to protocol 'AnyObject'
в этой строке кода:numberOfChanges = theme.valueForKey("numberThemeChanged") as Int32
,'Int32' is not identical to 'AnyObject'
в этой строке кода:theme.setValue(newValueThemeChanges, forKey: "numberThemeChanged")
Вы знаете, как я могу это сделать / что не так с моим кодом? Спасибо за Ваш ответ!
1 ответ
Методы кодирования ключ-значение
func valueForKey(key: String) -> AnyObject?
func setValue(value: AnyObject?, forKey key: String)
работа со значениями типа AnyObject
для целочисленного атрибута это экземпляры NSNumber
,
Существует автоматическое соединение между Int
а также NSNumber
, но не между Int32
а также NSNumber
(и это не имеет никакого отношения к тому факту, что вы определяете свойство как "Integer 32" в инспекторе модели базовых данных).
У вас есть несколько вариантов:
Просто используйте переменную типа
Int
:var numChanges = theme.valueForKey("numberThemeChanged") as Int numChanges++ theme.setValue(numChanges, forKey: "numberThemeChanged")
использование
Int32
и конвертировать из и вNSNumber
в явном виде:var numberOfChanges = (theme.valueForKey("numberThemeChanged") as NSNumber).intValue // Int32 numberOfChanges++ theme.setValue(NSNumber(int: numberOfChanges), forKey: "numberThemeChanged")
Используйте Xcode -> Editor -> Create NSManagedObject subclass ... и отметьте опции "Использовать скалярные свойства для примитивных типов данных". Это даст вам подкласс управляемого объекта со свойством
@NSManaged var numberThemeChanged: Int32
и вы можете получить доступ к свойству без кодирования значения ключа:
var numberOfChanges = theme.numberThemeChanged numberOfChanges++ theme.numberThemeChanged = numberOfChanges
Вот полный пример создания или обновления:
var theme : Entity!
let request = NSFetchRequest(entityName: "Entity")
var error : NSError?
if let result = context.executeFetchRequest(request, error: &error) as [Entity]? {
if result.count > 0 {
// (At least) one object found, set `theme` to the first one:
theme = result.first!
} else {
// No object found, create a new one:
theme = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as Entity
// Set an initial value:
theme.setValue(0, forKey: "numberThemeChanged")
}
} else {
println("Fetch failed: \(error?.localizedDescription)")
}
// Get value and update value:
var numChanges = theme.valueForKey("numberThemeChanged") as Int
numChanges++
theme.setValue(numChanges, forKey: "numberThemeChanged")
// Save context:
if !context.save(&error) {
println("Save failed: \(error?.localizedDescription)")
}
println(numChanges)