2015-06-11 12 views
29

Nel libro "The Swift Programming Language" (pagina 599), mi sono imbattuto in questo snippet di codice che mi ha confuso. E 'andata così:?? operator in Swift

func buyFavoriteSnack(person:String) throws { 
    let snackName = favoriteSnacks[person] ?? "Candy Bar" 
    try vend(itemName:snackName) 
} 

La sua spiegazione è stata:

Il buyFavoriteSnack (_ :) funzione alza gli occhi snack preferito la data della persona e cerca di acquistare per loro. Se non hanno uno snack preferito elencato, cerca di comprare un candy bar. Se loro ...

Come può questa spiegazione mappare al "??" operatore nel codice indicato. Quando dovremmo/possiamo usare questa sintassi nel nostro codice?

+2

C'è un "La Swift Programming Language" iBook, e si può * * ricerca per "??" in iBooks. Il primo colpo è il capitolo "Nil Coalescing Operator" ... –

+4

Sì, sì, l'ho perso. Succede al meglio di noi. – avismara

risposta

41

È "operatore a coalescenza nulla" (chiamato anche "operatore predefinito"). a ?? b è il valore di a (ad esempio a!), a meno che a sia nil, nel qual caso restituisce b. Cioè se manca favouriteSnacks[person], restituire al suo posto "Candy Bar".

EDIT Tecnicamente può essere interpretato come: (dalla risposta di Badar Al-Rasheed sotto)

let something = a != nil ? a! : b 
+0

Sì, Google non è stato utile con i punti interrogativi. In qualche modo mi sono perso questo nei miei studi. L'operatore coalescente nil ha fatto per me. – avismara

+0

Se il valore di 'a' è diverso da zero, il valore di' b' non viene valutato. Questo è noto come valutazione di cortocircuito. – iDhaval

+0

Il grosso problema con il ?? l'operatore in Swift è che 'a' non viene scartato come parte di esso. Ma 'b' non deve essere una variabile opzionale facoltativa o scartata implicita. –

11

questo:

let snackName = favoriteSnacks[person] ?? "Candy Bar" 

È uguale a questo:

if favoriteSnacks[person] != nil { 
    let snackName = favoriteSnacks[person]  
} else { 
    let snackName = "Candy Bar" 
} 

Spiegando a parole, se lo let dichiarazione non riescono a prendere person da favoriteSnacks sarà assegnato Candy Bar al snackName

+0

Sembra che Candy Bars sia il preferito di tutti :) – BangOperator

0

One Oltre a @ risposta di Icaro è possibile dichiarare i valori senza di loro inizializzazione. A mio parere questo è meglio:

func buyFavoriteSnack(person:String) throws { 
    // let snackName = favoriteSnacks[person] ?? "Candy Bar" 
    let snackName: String 

    if let favoriteSnackName = favoriteSnacks[person] { 
     snackName = favoriteSnackName 
    } else { 
     snackName = "Candy Bar" 
    } 

    try vend(itemName:snackName) 
} 
9
let something = a ?? b 

significa

let something = a != nil ? a! : b