9
votes

Langue SWIFT: Vérifiez NIL, et si oui instancier nouvel objet

Y a-t-il un moyen de simplifier cela:

var unloadedImagesRows = [String:[Int]]()

private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    if unloadedImagesRows[forLocation] == nil {
                    unloadedImagesRows[forLocation] = [Int]()
    }
    unloadedImagesRows[forLocation]!.append(row)
}


2 commentaires

À peu près sûr que votre réponse est la plus simple Swift a à offrir. Tous les autres ici semblent être moins simples et / ou efficaces. J'ai creusé pendant plus d'une heure à ce sujet et je ne pense pas qu'il existe un moyen plus simple d'exprimer cela.


Connaissez-vous un exemple d'une autre langue qui fait cela mieux? Je suis curieux de savoir ce qui a inspiré cette question et s'il y a une autre façon d'une autre langue, proposer peut-être un ajout de fonctionnalité similaire à Swift Open Source.


6 Réponses :


1
votes

Vous pouvez utiliser si vous pouvez utiliser l'instruction de Let ou Guard xxx

instruction de garde xxx

pour plus d'informations. Cochez cette page Lien


0 commentaires

1
votes

Vous pouvez le vérifier comme suit.

private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    if let image = unloadedImagesRows[forLocation] {
                //it is not nil
    } else {
        //it is nil
    }

}


0 commentaires

2
votes
var unloadedImagesRows = [String:[Int]]()

// if let
private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    if let _ = unloadedImagesRows[forLocation] {

    } else {
        unloadedImagesRows[forLocation] = [Int]()
    }
    unloadedImagesRows[forLocation]!.append(row)
}

// guard let
private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    guard let _ = unloadedImagesRows[forLocation] else {
        unloadedImagesRows[forLocation] = [Int]()
        return addToUnloadedImagesRow(row, forLocation: forLocation)
    }

    unloadedImagesRows[forLocation]!.append(row)
}

// nil coalescing
private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    var b = unloadedImagesRows[forLocation] ?? [Int]()
    b.append(row)
    unloadedImagesRows[forLocation] = b
}

1 commentaires

On dirait que Nil Coalescing ne peut être utilisé que d'une manière parce que quelqu'un a la même réponse que j'ai pour cela. Apparemment, il me battait jusqu'à ce que je monte / travaille dans une aire de jeux. UPVOTE!



2
votes

Vous pouvez créer un opérateur d'assistant pour les chèques NIL et l'utiliser comme ci-dessous.

var unloadedImagesRows = [String:[Int]]()

private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    unloadedImagesRows[forLocation] ?= [Int]()
    unloadedImagesRows[forLocation]!.append(row)
}

addToUnloadedImagesRow(1, forLocation: "This is something")

print(unloadedImagesRows) // "["This is something": [1]]\n"


0 commentaires

2
votes

Si vous souhaitez éviter si code> ou gardien code> vous pouvez essayer le Opérateur de coalescence nul (??) .

private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    var rowsForLocation = unloadedImagesRows[forLocation] ?? [Int]();
    rowsForLocation.append(row)
    unloadedImagesRows[forLocation] = rowsForLocation
}


0 commentaires

8
votes

Vous pouvez le simplifier en une seule ligne:

private func addToUnloadedImagesRow(row: Int, forLocation:String!) {
    unloadedImagesRows[forLocation] = (unloadedImagesRows[forLocation] ?? []) + [row]
}


1 commentaires

Si charmant! J'essayais si fort de comprendre ça! Bien que cela ait dû être + = ... beau travail!