Проверьте, установлено ли свойство в Core Data?

как я могу проверить, установлено ли свойство в объекте Core Data?

Я загружаю все мои основные объекты данных в каталог:

var formQuestions = [Questions]()

И мои основные данные NSManagementObject:

@NSManaged var noticeText: String

formQuestions [indexPath.row].noticeText

//загрузить с помощью:

var fetchRequest = NSFetchRequest(entityName: "Questions")
fetchRequest.predicate = NSPredicate(format: "forms = %@", currentForm!)
formQuestions = context.executeFetchRequest(fetchRequest, error: nil) as [Questions]

Мое свойство "noticeText" может быть пустым или нет, поэтому, когда я создаю свой объект Core Data, некоторые значения могут быть не установлены. (Свойство задано как необязательное в Core Data)

Когда я пытаюсь проецировать, если есть значение, оно всегда приносит мне "EXC_BAD_ACCESS...."

if(formQuestions[indexPath.row].noticeText.isEmpty == false)

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

Итак, как я могу проверить, существует ли (optinal) и не установленное значение?

Спасибо заранее.

Ответ 1

Обновление для Xcode 7: Эта проблема была решена с помощью Xcode 7 beta 2. Дополнительные свойства Core Data теперь определяются как дополнительные свойства в подклассах управляемых объектов, сгенерированных Xcode. Это уже не необходимые для редактирования сгенерированного определения класса.


(Предыдущий ответ:)

При создании подклассов NSManagedObject Xcode не определяет дополнительные свойства для тех атрибутов, которые помечены как "необязательные" в инспекторе модели Core Data. Это похоже на ошибку.

В качестве обходного пути вы можете передать свойство необязательный (as String? в вашем случае), а затем проверить его с необязательной привязкой

if let notice = someManagedObject.noticeText as String? {
    println(notice)
} else {
    // property not set
}

В вашем случае это будет

if let notice = formQuestions[indexPath.row].noticeText as String? {
    println(notice)
} else {
    // property not set
}

Обновление: Как и в Xcode 6.2, это решение больше не работает и сбой при выполнении исключения EXC_BAD_ACCESS (сравните Swift: обнаружение неожиданного значения nil в необязательном во время выполнения: литье в качестве необязательного сбоя)

Решение "Старый ответ" ниже работает.


(Старый ответ:)

Как уже отмечалось в Daij-Djan в комментарии, вы должны определить свойство для необязательный атрибут Core Data как необязательный или неявно развернутый необязательный:

@NSManaged var noticeText: String? // optional
@NSManaged var noticeText: String! // implicitly unwrapped optional

К сожалению, Xcode неправильно определяет дополнительные свойства при создании подклассы NSManagedObject, что означает, что вам необходимо повторно применить изменения если вы создадите подклассы снова после изменения модели.

Также это, похоже, все еще недокументировано, но оба варианта работали в моем тестовом случае.

Вы можете проверить свойство с помощью == nil:

if formQuestions[indexPath.row].noticeText == nil {
    // property not set
}

или с дополнительным назначением:

if let notice = formQuestions[indexPath.row].noticeText {
    println(notice)
} else {
    // property not set
}

Ответ 2

Ваше приложение терпит крах, потому что вы пытаетесь получить доступ к not optional variable nil. Это не допускается быстро. Чтобы исправить вашу проблему, просто добавьте в подкласс NSManagedObject a ?, чтобы сделать свойство необязательным:

@objc class MyModel: NSManagedObject {
    @NSManaged var noticeText: String? // <-- add ? here
}

Затем, чтобы проверить свойство, вы можете сделать следующее:

if let aNoticeText = formQuestions[indexPath.row].noticeText? {
    // do something with noticeText
}