J'aimerais savoir s'il y a un moyen plus élégant d'écrire ceci: J'ai essayé d'utiliser carte code> pour tableau, mais je ne peux pas trouver un moyen de le faire. p> p>
5 Réponses :
struct S {
var state: [String: Any]
public var amounts: [Amount] {
return (self.state["amounts"] as? [Any] ?? []).map({ Amount($0) })
}
}
struct Amount {
init(_ any: Any?) {}
}
J'obtiens une erreur: Impossible de convertir la valeur de type "Montant" en type de résultat de fermeture "[Montant]"
@Rob remplace return par return (self.state ["montants"] comme? [Any] ?? []). Map ({Amount ($ 0)})
Vous utilisez ici trop d'options inutiles. Vous devez toujours utiliser as? avec un type non facultatif. Et au lieu de forEach , utilisez map:
public var amounts: [Amount] {
if let anyArray = self.state["amounts"] as? [Any] {
return anyArray.map(Amount.init)
} else {
return []
}
}
Vous pouvez faire fonctionner cela en une seule ligne,
public var amounts: [Amount] {
return (self.state["amounts"] as? [Any])?.map({ Amount($0) }) ?? []
}
Vous pouvez également utiliser guard let et early return, ce qui le rendrait un peu meilleur.
Voici comment je l'ai fait,
struct S {
var state: [String: Any]
public var amounts: [Amount] {
guard let amounts = state["amounts"] as? [Any] else {
return []
}
return amounts.map(Amount.init)
}
}
Je suis d'accord avec ça. Approche très rapide et facile à comprendre par rapport aux autres réponses.
Pensez-vous que map (Amount.init) serait plus lisible que .map {Amount ($ 0)} ?
Cela dépend des gens aux gens. Je suppose que OP connaîtrait la syntaxe Swift de base. Pour moi, la carte (Amount.init) est certainement lisible et plus courte que celle avec une fermeture complète.
init(_ state: [Amount]) {
self.init()
guard let amounts = state["amounts"] as? [Any] else {
return []
}
return amounts.map(Amount.init)
}
La valeur de
montantsest probablement quelque chose de plus spécifique que[Any]Étant donné que le tableau
montantsserait rempli en fonction de la valeur facultative destate, je suggérerais de le déclarer comme un tableau facultatif ([ Montant]?).