2016-04-12 9 views
7

C'è un modo per semplificare questo:lingua Swift: nullo controllare, e in tal caso l'istanza nuovo oggetto

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

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

Non ritiene Swift avere un modo semplice per verificare la presenza di nil, e in tal caso, creare una nuovo oggetto e tutti gli usi successivi si riferiscono all'oggetto?

+1

Abbastanza sicuro la vostra risposta è il più semplice veloce ha da offrire. Tutti gli altri qui sembrano essere meno semplici e/o efficienti. Ho scavato per più di un'ora su questo e non penso che ci sia un modo più semplice per esprimere questo. –

+0

Sei a conoscenza di un esempio di un'altra lingua che lo fa meglio? Sono curioso di sapere cosa ha ispirato questa domanda e se c'è un'altra via da un'altra lingua, magari propongo un'aggiunta simile a quella di Swift open source. –

risposta

8

è possibile semplificare in una sola riga:

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

Così dolce! Stavo provando così tanto a capirlo! Anche se doveva essere + = ... Bel lavoro! –

1

si può usare se lasciare o una dichiarazione di guardia

private func addToUnloadedImagesRow(row: Int, forLocation:String!) { 
     if let a = unloadedImagesRows[forLocation] as? [Int] { 
      //...success block 
     } 
    } 

o utilizzare dichiarazione guardia

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

per maggiori informazioni. controllare questo link

1

È possibile controllare come segue.

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

} 
1
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 
} 
+0

Sembra che nil coalescing possa essere usato in un modo solo perché qualcuno ha la stessa risposta che ho per quello. Apparentemente mi ha picchiato mentre lo stavo modificando/elaborando in un parco giochi. Upvote! –

+0

Voto positivo! nel senso che ho svalutato il suo. –

2

È possibile creare un operatore di supporto per i controlli nil e utilizzarlo come qui di seguito.

infix operator ?= { associativity left precedence 160 } 

func ?=<T: Any>(inout left: T?, right: T) -> T { 
    if let left = left { 
     return left 
    } else { 
     left = right 
     return left! 
    } 
} 

Qui si sarà in grado di usarlo come unloadedImagesRows[forLocation] ?= [Int]() se vuota

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

Dovevo forzare questo. Stato del mago rapido! –

2

Se si vuole evitare if o guard si potrebbe provare la nil coalescing operator (??).

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

Nota:Questo potrebbe non essere molto efficiente, in quanto si deve ri-assegnare la matrice al dizionario. Non sono sicuro che ciò comporterà una copia completa dell'array.

Problemi correlati