У меня есть немного странная проблема, которую я не могу понять, у меня есть простой объект с пользовательским подклассом NSManagedObject:
@objc(EntityTest) class EntityTest: NSManagedObject {
@NSManaged var crDate: NSDate
@NSManaged var name: String
@NSManaged var completed: Bool
@NSManaged var completedOn: NSDate
}
Это проблема, я могу создать объект в порядке и установить все значения и сохранить в массиве. Как бы то ни было, когда я пытаюсь получить один и тот же объект, я могу установить все значения EXCEPT в поле "complete". Я получаю ошибку времени выполнения, говоря "EXC_BAD_ACCESS", я могу прочитать значение, просто не могу его установить.
Отладчик указывает на:
0x32d40ae: je 0x32d4110 ; objc_msgSend + 108
0x32d40b0: movl (%eax), %edx
Возможно, некоторые проблемы из-за того, что он рассматривается как класс Objective-C и пытается отправить сообщение для установки boolean, которое, как мне известно, немного смешно с CoreData, первоначально представляющим их как NSNumbers.
Любые идеи? Я сам создал класс, он не генерируется.
EDIT:
entity.crDate = NSDate() // succeeds
entity.completed = false // fails
entity.completed.setValue(false, forKey: "completed") //succeeds
Итак, для установки bool использование setValue из NSManagedObject работает, но не для прямых сеттеров, хотя для свойств non-bool я могу установить его с помощью установщиков.
UPDATE:
Проверяя это немного больше, кажется, что в первый раз, когда я установил значение после получения из NSEntityDescription, он использует обычные методы доступа Swift. Позже, когда я пытаюсь получить доступ к одному и тому же объекту (который хранился в массиве), он пытается рассматривать его как объект стиля Objective-C и отправляет сообщение для метода с именем "setCompleted" . Я предполагаю, что это имеет смысл, поскольку я использую точечную нотацию для доступа к ней, и я использовал директиву @objc.
Я проверил это, создав метод "setCompleted" , однако в методе я установил значение с помощью "completed = newValue", что делает рекурсивный вызов "setCompleted" , из-за которого он сбой... Странно, поэтому при этом момент все еще не может иметь правильного исправления. Кажется, это происходит только с Bools.
Только обходной путь использует метод setValueForKey для NSManagedObject. Возможно, это файл отчета об ошибке?