0
votes

Swift: Une manière plus élégante d'écrire ce mappage de tableau?

J'aimerais savoir s'il y a un moyen plus élégant d'écrire ceci: xxx

J'ai essayé d'utiliser carte pour tableau, mais je ne peux pas trouver un moyen de le faire.


2 commentaires

La valeur de montants est probablement quelque chose de plus spécifique que [Any]


Étant donné que le tableau montants serait rempli en fonction de la valeur facultative de state , je suggérerais de le déclarer comme un tableau facultatif ( [ Montant]? ).


5 Réponses :


3
votes
struct S {
    var state: [String: Any]
    public var amounts: [Amount] {
        return (self.state["amounts"] as? [Any] ?? []).map({ Amount($0) })
    }
}

struct Amount {
    init(_ any: Any?) {}
}

2 commentaires

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



2
votes

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 []
    }
}


0 commentaires

1
votes

Vous pouvez faire fonctionner cela en une seule ligne,

public var amounts: [Amount] {
    return (self.state["amounts"] as? [Any])?.map({ Amount($0) }) ?? []
}


0 commentaires

4
votes

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

}


3 commentaires

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.



1
votes
init(_ state: [Amount]) {
    self.init()
    guard let amounts = state["amounts"] as? [Any] else {
        return []
    }

    return amounts.map(Amount.init)
}

0 commentaires