Liaison optionnelle avec essayer? et comme? produit toujours un type optionnel

J'ai le code pour exécuter un NSFetchRequest et couler son résultat à un tableau de mon type de model de données personnalisé. Aller chercher peut jeter mais je ne veux pas me soucier de l'erreur, donc try? , et j'utilise aussi as? en casting. Dans Swift 2, c'était très bien, mais Swift 3 produit un double optionnel:

 var expenses: [Expense]? { let request = NSFetchRequest<NSFetchRequestResult>(entityName: Expense.entityName) request.predicate = NSPredicate(format: "dateSpent >= %@ AND dateSpent <= %@", [self.startDate, self.endDate]) // Returns [Expense]? because right side is [Expense]?? if let expenses = try? App.mainQueueContext.fetch(request) as? [Expense], expenses?.isEmpty == false { return expenses } return nil } 

Comment est-ce que je peux reformuler le côté droit de ma binding optionnelle dans if let que son type sera simplement un tableau [Expense] ? Je pense qu'il semble absurde que dans la condition booleanne suivante (qui était une clause where ), le tableau soit toujours optionnel.

Vous devez envelopper votre try? appeler entre parenthèses comme ceci:

 if let expenses = (try? App.mainQueueContext.fetch(request)) as? [Expense] 

C'est parce as? a une priorité plus élevée que d' try? (probablement parce que try? peut être appliqué à l'expression entière).

@ La réponse de Fantattitude donne ce que vous voulez. Mais il me faut un certain time pour parcourir le document afin de savoir pourquoi . Trop longtime pour être un commentaire, alors voici la reference:


Selon le chapitre sur les expressions de Swift Programming Language (Swift 3)

Lorsque l'expression du côté gauche d'un opérateur binary est marquée avec try, essayez ?, ou essayez !, cet opérateur s'applique à toute l' expression binary.

Tout d'abord, je pensais as n'est peut- être pas un opérateur binary, mais dans les opérateurs de bibliothèque Swift Standard

as , as? et as! sont les opérateurs opérateurs Infix

et dans le chapitre Déclaration de l'opérateur

Un opérateur infixe est un opérateur binary écrit entre ses deux opérandes, tel que l'opérateur d'addition familier (+) dans l'expression 1 + 2.