2015-11-23 28 views
6

Sono stato tentando di seguire alcuni tutorial iOS Swift per il collegamento a Parse.comin Swift, cosa significa questa specifica sintassi?

codementor.io tutorial:

loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton | .Facebook | .Twitter 

makeschool tutorial

loginViewController.fields = [.UsernameAndPassword, .LogInButton, .SignUpButton, .PasswordForgotten, .Facebook] 

Suppongo che il primo è interruttore 1.x, e il terzo è Swift 2. Dal contesto sembra che stiano facendo la stessa cosa, ma non ho ancora trovato i riferimenti al linguaggio per la modifica della sintassi. Difficilmente difficile cercare punti, pipe e virgole ... qualcuno può spiegare la sintassi in ogni frammento? (Sto lavorando per leggere le specifiche della lingua, ma sarebbe divertente per far funzionare un'app!)

risposta

7

La vecchia Swift 1 sintassi si basa sul modo in cui avete a che fare con i set di opzione in C e Objective-C: si memorizza un set di opzioni in un tipo intero e utilizzare gli operatori bit a bit (| e & e ~) per manipolarli. Pertanto, .UsernameAndPassword | .LogInButton indica un'opzione in cui sono incluse sia le opzioni .UsernameAndPassword sia le opzioni .LogInButton. Nella vecchia sintassi, si utilizza nil per rappresentare un set di opzioni vuoto (in cui non sono incluse opzioni), il che non è ovvio in base alla sintassi per un set non vuoto.

Chris Lattner ha descritto la sintassi modificata in WWDC 2015 Session 106: What's New in Swift. Per prima cosa descrive i problemi con la vecchia sintassi:

Il problema è che quando si arriva alle altre sintassi che si utilizza, è un po 'meno bello. Crei un set di opzioni vuote con zero - non ha senso perché i set di opzioni e gli opzionali sono concetti completamente diversi e sono fusi insieme. Li estrai con operazioni bit a bit, che sono dolorose e soggette ad errori, e puoi sbagliare facilmente.

Poi descrive il nuovo approccio:

Ma Swift 2 risolve questo. Rende gli insiemi di opzioni impostati. Ciò significa che set di opzioni e insiemi ora sono formati con parentesi quadre. Ciò significa che ottieni set vuoti con un set vuoto di parentesi quadre e ottieni il set completo di API standard per lavorare con i set di opzioni.

La ragione per la nuova sintassi funziona è perché OptionSetType conforme al protocollo ArrayLiteralConvertible (indirettamente, conformandosi ai SetAlgebraType). Questo protocollo consente di inizializzare un oggetto conforme usando un array letterale, avendo un init che accetta un elenco di elementi.

Nella nuova sintassi Swift 2, [ .UsernameAndPassword, .LogInButton ] rappresenta un gruppo di opzioni contenente entrambe le opzioni .UsernameAndPassword e .LogInButton. Si noti che sembra proprio la sintassi con cui è possibile inizializzare un semplice vecchio Set: let intSet: Set<Int> = [ 17, 45 ]. La nuova sintassi rende evidente che si specifica un'opzione vuota impostata come [].

1

Swift non supporta più l'operatore di barra verticale utilizzato la prima linea. Il secondo sta prendendo i diversi casi di un'enumerazione e li descrive come una serie di opzioni. Ecco un esempio from the Swift docs:

enum CompassPoint { 
    case North 
    case South 
    case East 
    case West 
} 

directionToHead = .South 

switch directionToHead { 
case .North: 
    print("Lots of planets have a north") 
case .South: 
    print("Watch out for penguins") 
case .East: 
    print("Where the sun rises") 
case .West: 
    print("Where the skies are blue") 
} 

// prints "Watch out for penguins" 
+0

"Il secondo sta prendendo i diversi casi di un'enumerazione e li mette in un array." No, il secondo è un sostituto del primo. – NobodyNada

+0

@NobodyNada sì, entrambi fanno la stessa cosa - descrivono una raccolta di casi enum. – tylersimko

+2

Tipo di, ma è un set di opzioni, non un array. – NobodyNada

Problemi correlati