Swift + CoreData: не может автоматически устанавливать дополнительный атрибут на сгенерированном подклассе NSManagedObject
У меня есть объект coredata с именем Record и имеет свойство dateUpdated. Я заметил, что сгенерированный подкласс NSManagedObject не имеет необязательной метки (?)
Редактор CoreData:
![enter image description here]()
Сгенерированный подкласс:
![enter image description here]()
Ожидаемое:
![enter image description here]()
ОБНОВЛЕНО:
Он утомительный в моей части, потому что каждый раз, когда я хочу регенерировать подклассы, это означает, что мне также необходимо обновить все необязательные значения вручную. Наличие необязательного (без??) В подклассе заставляет меня проверять значение перед назначением, например, пример ниже:
// sample value:
// serverDateFormatter = "yyyy/MM/dd"
// dateString = ""
// Branch is a subclass of Record (see above images)
var date = self.coreData.serverDateFormatter.dateFromString(dateString)
if date != nil
{
branch.dateUpdated = date
}
Но если xcode может автоматически установить необязательное значение в подклассе с (?), мне просто нужно сделать вот так:
branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)
В моем случае у меня есть набор свойств, которые мне нужно пометить как необязательные вручную.
Ответы
Ответ 1
Необязательный флажок в редакторе модели основных данных уже существовал до Swift и его опций, которые были введены. Apple заявляет об этом в своем Руководство по программированию основных данных:
Вы можете указать, что атрибут является необязательным, то есть он не является необходимо иметь ценность. В целом, однако, вам не рекомендуется от этого - особенно для числовых значений (как правило, вы можете получить лучшие результаты с использованием обязательного атрибута со значением по умолчанию - в модель - 0). Причина этого в том, что SQL имеет специальное сравнение поведение для NULL, что в отличие от Objective-C nil. NULL в базе данных это не то же самое, что и 0, и поиск 0 не будет соответствовать столбцам с NULL.
Таким образом, используя Swift и Xcode 8, необязательный флажок (по-прежнему) не связан с тем, что вы определили свои свойства как необязательные или нет в подклассах managedObject. И не ожидайте, что дополнительный флажок будет иметь какое-либо влияние на ваши свойства NSManagedObject, если вы создадите их с помощью редакторa > Create NSManagedObject Subclass.
Тем не менее, каждый раз, когда мне нужно свойство, чтобы его необязательный флажок установлен в редакторе моделей, я сразу же помещаю его объявление NSManagedObject
Subclass как необязательное.
Добавление
Mogenerator позволяет автоматически переключать свойства подкласса NSManagedObject
с необязательного на факультативный каждый раз, когда вы изменяете этот параметр для каждый из вашего атрибута Entity в Data Model Inspector и перестройте свой проект.
Ответ 2
Обход проблемы:
Да, это похоже на ошибку/ограничение.
Используйте нескалярные типы для решения этой проблемы.
Дополнительные атрибуты
- Установите флажок опцию
- Снимите флажок "Скаляр".
Необязательные атрибуты
- Снимите флажок опционально.
- Установите флажок "Скалярный флажок"
Вероятная причина:
Код Swift преобразуется в Objective-C, а Objective-C не поддерживает значения nil для неклассовых типов.