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:
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)") } }