J'ai une entité coredata nommée Record et j'ai une propriété dateUpdated. J'ai remarqué que la sous-classe NSManagedObject générée n'a pas de marque facultative (?)
Éditeur CoreData:
Sous-classe générée:
Attendu:
MISE À JOUR: C'est fastidieux de ma part, car chaque fois que je veux régénérer les sous-classes, cela signifie que je dois également mettre à jour toutes les valeurs facultatives manuellement. Avoir un non-optionnel (sans '?') Dans la sous-classe m'a amené à vérifier la valeur avant l'attribution, comme l'exemple ci-dessous:
// 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
}
Mais si xcode peut automatiquement définir une valeur facultative dans la sous-classe avec (?), Je dois juste faire comme ceci:
branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)
Dans mon cas, j'ai un tas de propriétés que je dois marquer comme facultatif manuellement.
La case à cocher facultative dans l'éditeur de modèle de données de base existait avant Swift et ses options ont été introduites. Apple en fait état dans ses Core Data Guide de programmation :
Vous pouvez spécifier qu'un attribut est facultatif, c'est-à-dire qu'il n'est pas obligatoire d'avoir une valeur. En général, cependant, vous êtes découragé de le faire - en particulier pour les valeurs numériques (vous pouvez généralement obtenir de meilleurs résultats en utilisant un attribut obligatoire avec une valeur par défaut - dans le modèle - de 0). La raison en est que SQL a un comportement de comparaison spécial pour NULL qui est différent du nil d'Objective-C. NULL dans une base de données n'est pas identique à 0 et la recherche de 0 ne correspondra pas aux colonnes avec NULL.
Ainsi, en utilisant Swift et Xcode 8, la case à cocher facultative n'est (toujours) pas liée au fait que vous avez défini vos propriétés comme optionnelles ou non dans vos sous-classes managedObject. Et ne vous attendez pas à ce que la case à cocher facultative avoir un impact sur votre type facultatif de propriétés de sous-classes NSManagedObject
lorsque vous les créez à l'aide de Editeur > Créer Sous-classe NSManagedObject .
Cela dit, chaque fois que j'ai besoin d'une propriété pour que sa case à cocher facultative soit cochée dans l'éditeur de modèle, je mets immédiatement sa déclaration de sous-classe NSManagedObject
comme optionnelle.
Mogenerator est en mesure de basculer automatiquement vos propriétés de sous-classe NSManagedObject
de non facultatif à facultatif chaque fois que vous modifiez cette option pour chacun des attributs de votre entité dans l'inspecteur de modèle de données et reconstruisez votre projet.
Oui, cela semble être un bug/limitation. Utilisez des types non scalaires pour contourner ce problème.
Le code Swift est traduit en Objective-C et Objective-C ne prend pas en charge les valeurs nulles pour les types non-classe.