web-dev-qa-db-fra.com

Swift + CoreData: impossible de définir automatiquement l'attribut facultatif sur la sous-classe NSManagedObject générée

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:

enter image description here

Sous-classe générée:

enter image description here

Attendu:

enter image description here

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.

43
Allan Macatingrao

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.


Addenda

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.

45
Imanou Petit

Solution de contournement:

Oui, cela semble être un bug/limitation. Utilisez des types non scalaires pour contourner ce problème.

Attributs facultatifs

  • Cochez la case facultative
  • Décochez la case scalaire

Attributs non facultatifs

  • Décochez la case facultative
  • Cochez la case scalaire

Raison probable:

Le code Swift est traduit en Objective-C et Objective-C ne prend pas en charge les valeurs nulles pour les types non-classe.

9
user1046037