2015-12-03 11 views
5
if x == nil { 
    x = y 
} 

So che la dichiarazione di cui sopra può essere riscritta come:Stenografia per l'assegnazione se nulla in Swift?

x = x ?? y 

Ma x ??= y non è accettata dalla compilatore. C'è una scorciatoia per non ripetere x?

+0

L'operatore ?? = è stato rifiutato da Swift evolution: http://article.gmane.org/gmane.comp.lang.swift.evolution/7694 – yzyzsun

risposta

7

Controlla questo, inserisci quanto segue nello spazio codice globale (nel tuo Extensions.swift forse). Questo crea un operatore personalizzato che puoi utilizzare durante l'intero progetto.

Swift 2

infix operator ??= {} 
func ??= <T>(inout left: T?, right: T) { 
    left = left ?? right 
} 

Swift 3

infix operator ??= 
func ??= <T>(left: inout T?, right: T) { 
    left = left ?? right 
} 

Usage:

var foo: String? = nil 
var bar = "Bar" 
foo ??= bar 
print("Foo: \(bar)") 

Spero che questo aiuti :)

+2

Il parametro 'right' non ha bisogno di essere' inout'. –

+0

Viene visualizzato un errore durante il tentativo su Swift 3. Impossibile convertire il valore di tipo 'CGFloat' nel tipo di argomento previsto 'inout _?' (aka 'inout Opzionale <_>') – EdwardSanchez

+0

È necessario definire il 'CGFloat' come un' Optional', come questo: 'var foo: CGFloat?' – Laffen

2

Questo codice funziona nel parco giochi:

var x: Int? = nil 
let y = 5 
x = x ?? y // x becomes 5 

e

var x: Int? = 6 
let y = 5 
x = x ?? y // x stays 6 

Tra l'altro qui ci sono alcune varianti di verifica di zero:

if x != nil { 
    // classic 
} 

if x != .None { 
    // nil in Swift is enum with value .None 
} 

if let _x = x { 
    // if you need it's value 
} 
if let _ = x { 
    // if you don't need it's value 
} 

UPD: Codice per progetto - copia ed eseguilo:

var x: Int? = nil 
let y = 5 
x = x ?? y 
print (x) 
x = 7 
x = x ?? y 
print (x) 
+0

Sei sicuro che 'x' è cambiato? Nel mio caso, 'x' rimane nullo e solo il risultato di' x ?? y' è 'y'. – yzyzsun

+0

@yzyzsun Sì, certo. Ho appena aggiustato del codice e fornito l'aggiornamento. Vedi, – katleta3000

+0

Quindi penso che tu non abbia risolto la mia domanda. – yzyzsun