2015-11-19 56 views

risposta

7

Per ragioni di completezza, Optional ha un metodo map():

/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. 
@warn_unused_result 
@rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U? 

Pertanto

index != nil ? index! + 1 : nil 

è equivalente a

index.map { $0 + 1 } 
+0

Mi piace che l'incremento sia più visibile con '+ 1' e che possa funzionare con qualsiasi altro numero :) –

6

È possibile chiamare la struttura successor utilizzando opzionale concatenamento:

return index?.successor() 

Per un valore arbitrario, advancedBy opere:

return index?.advancedBy(15) 

Se ti sei trovato a fare questo molte volte in il tuo codice, potresti definire il tuo operatore + che aggiunge un Int ad un Int?:

func +(i: Int?, j: Int) -> Int? { 
    return i == nil ? i : i! + j 
} 

Poi si può solo fare:

return index + 1 
+0

Bella aggiunta alla tua risposta! –

+0

Grazie! Ho aggiunto ancora un altro. – vacawama

0

Opzionalmente si può chiamare qualsiasi metodo su un optional anteponendo la chiamata con un punto interrogativo, e questo funziona per operatori in forma suffissa troppo:

return index?++ 

Più in generale si può anche scrivere:

index? += 1; return index 
+1

Come detto in una domanda cancellata, questo ha lo svantaggio di non funzionare quando l'indice è una costante (let) –

+0

'indice di ritorno? + = 1' non funziona. Fornisce errore di compilazione 'errore: impossibile convertire l'espressione di ritorno di tipo '()?' per restituire il tipo 'Int?' ' – vacawama

+0

Hai ragione. Ho modificato il mio snippet di codice per risolvere il problema. Ad ogni modo, non soddisfa ancora l'esigenza di lavorare con let e c'è già una buona risposta usando la mappa. –