Enveloppe facultative dans Swift, pourquoi Swift ajoute le "Facultatif" à la string

J'enregistre un tableau dans un model, lorsque l'logging des données n'est pas encapsulé avec Optional (…) cependant lorsque datatables sont en cours de lecture, je récupère l'option (…). Appréciez votre aide et votre patience car je suis nouveau à Swift.

C'est l' println lors de l'ajout des valeurs au model:

 saveOperativesInModel: Test Name 

C'est l' println lors de la lecture des valeurs du model:

 getOperativesFromModel: Optional(Test Name) 

Pourquoi Swift ajoute-t-il "Optional (xxx)" à la string?

C'est le code réduit:

 func saveOperativesInModel() { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let managedContext = appDelegate.managedObjectContext! let entity = NSEntityDescription.entityForName("Operatives", inManagedObjectContext: managedContext) var item: NSManagedObject! if let operativesList = self.operativesResult?.operativesList { self.operativesTable.removeAll() for itemInArray in operativesList { item = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext) item.setValue(itemInArray.firstName, forKey: "firstName") var error: NSError? if !managedContext.save(&error) { } else { self.operativesTable.append(item!) println("saveOperativesInModel: \(itemInArray.firstName)") } } } let fetchRequest1: NSFetchRequest! = NSFetchRequest(entityName:"Operatives") let fetchedResults = managedContext.executeFetchRequest(fetchRequest1, error: &error) as? [NSManagedObject] if let operativesTable = fetchedResults { if operativesTable.count > 0 { for item in operativesTable { let operative: Operative! = Operative() operative.firstName = Ssortingng (ssortingngInterpolationSegment: item.valueForKey("firstName")) println("getOperativesFromModel: \(operative.firstName)") } } } } 

L' Optional apparaît dans la console car item.valueForKey renvoie un object AnyObject? , un type optionnel. Puisque vous utilisez la valeur valueForKey dans votre segment d'interpolation de string, cette valeur devient facultative. Par conséquent, la valeur imprimée sur la console est facultative et Swift ajoute automatiquement l'encapsuleur Optional() autour des valeurs facultatives dans la console.

Pour éviter ce comportement, vous pouvez:

  • Forcez le valueForKey la valeur de valueForKey en utilisant le ! (force déployer) opérateur, qui ressemblerait à quelque chose comme ceci: Ssortingng(ssortingngInterpolationSegment: item.valueForKey("firstName")!) , ou
  • Utilisez if let pour vérifier une valeur, puis imprimez la valeur déballée. Par exemple:

     if let firstName = item.valueForKey("firstName") { operative.firstName = Ssortingng(firstName) println("getOperativesFromModel: \(operative.firstName)") } 

Il a déjà été répondu pourquoi vous voyez "Optional (…)" dans la sortie. Voici quelques idées supplémentaires sur la façon de résoudre le problème.

La raison pour laquelle vous avez écrit

 operative.firstName = Ssortingng (ssortingngInterpolationSegment: item.valueForKey("firstName")) 

est probablement une affectation directe

 operative.firstName = item.valueForKey("firstName") 

ne comstack pas: Le rhs a le type AnyObject? , alors que le lhs est une Ssortingng .

Une meilleure solution serait une dissortingbution optionnelle

 if let firstName = item.valueForKey("firstName") as? Ssortingng { operative.firstName = firstName } else { // There is no first name, or it is not a Ssortingng. } 

Ou utilisez l'opérateur nil-coalescing ?? pour fournir une valeur par défaut:

 operative.firstName = item.valueForKey("firstName") as? Ssortingng ?? "default name" 

Mais ce que je ferais réellement est de laisser Xcode créer des files de sous-classs d'objects NSManaged pour l'entité Core Data (peut-être avez-vous déjà fait cela?). Ensuite, vous n'avez plus besoin des methods de encoding Key-Value et pouvez accéder directement aux propriétés des entités:

 let fetchRequest1: NSFetchRequest! = NSFetchRequest(entityName:"Operatives") let fetchedResults = managedContext.executeFetchRequest(fetchRequest1, error: &error) as? [Operatives] if let operativesTable = fetchedResults { for item in operativesTable { let operative = Operative() operative.firstName = item.firstName println("getOperativesFromModel: \(operative.firstName)") } }