2015-06-11 11 views
29

Im "The Swift Programming Language" Buch (Seite 599), ich kam in diesem Code-Schnipsel, die mich Art von verwirrten. Es ging so:?? Betreiber in Swift

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

Seine Erklärung war:

Die buyFavoriteSnack (_ :) Funktion der gegebenen Person Lieblingsimbiß sucht und versucht, es für sie zu kaufen. Wenn sie keinen Lieblingsimbiss aufgelistet haben, versucht sie einen Schokoriegel zu kaufen. Wenn sie ...

Wie kann diese Erklärung auf die "??" Operator im angegebenen Code. Wann sollten/können wir diese Syntax in unserem eigenen Code verwenden?

+2

Es gibt einen "Der Swift Programming Language" iBook, und Sie * kann * Suche nach "??" in iBooks. Der erste Treffer ist der „Nil Coalescing Operator“ Kapitel ... –

+4

Ja, ja, ich habe es verpasst. Passiert für die Besten von uns. – avismara

Antwort

41

Es heißt "Null Operator Koaleszieren" (auch "default Operator" genannt). a ?? b ist Wert a (d.h. a!), es sei denn, anil ist, in welchem ​​Fall es ergibt b. I.e. Wenn favouriteSnacks[person] fehlt, geben Sie stattdessen "Candy Bar" zurück.

EDIT Technisch kann interpretiert werden: (von Badar Al-Rasheed Antwort- unten)

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

Yup, Google war nicht hilfreich bei den Fragezeichen. Irgendwie habe ich das in meinen Studien verpasst. Der Null-Koaleszenz-Operator hat es für mich getan. – avismara

+0

Wenn der Wert von "a" nicht gleich Null ist, wird der Wert von "b" nicht ausgewertet. Dies wird als Kurzschlussauswertung bezeichnet. – iDhaval

+0

Das große Problem mit dem ?? Betreiber in Swift ist, dass "a" nicht als Teil davon ausgepackt ist. Aber "b" muss eine optionale oder implizite optionale Option sein, die nicht optional ist. –

11

Dieses:

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

Ist entspricht dies:

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

Erklären in Worten, wenn die let Anweisung scheitern person von favoriteSnacks zu packen es Candy Bar zum snackName

+0

Scheint Schokoriegel sind jedermanns Lieblings :) – BangOperator

0

One Neben @ Icaro Antwort zugewiesen werden Sie Werte erklären können sie ohne initialisieren. Meiner Meinung nach ist dies besser:

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 

bedeutet

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