2014-06-09 12 views
11

a Swift la seguente sintassi è consentito per il controllo del flussoCome viene utilizzato il collegamento facoltativo in swift?

if let constantName = someOptional { 
    statements 
} 

In questo contesto quali sono la semantica del contesto valore di verità?

È concatenamento di espressione (come di seguito) consentito?

if let constantName = someOptional && constantName2 = someOptional2 { 
    statements 
} 

In tal caso, il cortocircuito dell'espressione booleana?

+2

Prima 'someOptional' è spuntato per vedere se il suo' nil'. Se non lo è, quindi 'constantName' è assegnato al valore unwrapped di' someOptional'. Se è 'nil', va all'istruzione' else'. Questo è spiegato in modo approfondito nel vid 'Intermediate Swift':] – Jack

+1

Che dire [la documentazione] (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TheBasics.html # // apple_ref/doc/uid/TP40014097-CH5-XID_432) non è stato chiaro? – Chuck

+0

@Chuck È come la prima cosa su cui è atterrato lo sguardo, guardando lo swing. Non sono ** familiare con la nozione di 'nil' in questa lingua, né ho mai scritto in esso. Nel chiedere una cosa del genere, mi aspetto anche di ottenere un metodo di ricerca e collegamenti alle giuste pagine di documentazione della lingua. Non mi aspettavo quel livello di elitarismo in una lingua così neonata, forse meglio non scherzare con un linguaggio che ha una comunità così negativa –

risposta

17

Il primo someOptional viene controllato per vedere se è nullo o contiene dati. Se è nulla, l'istruzione if non viene eseguita. Se ci sono dati, i dati vengono scartati e assegnati a constantName per l'ambito dell'istruzione if. Quindi viene eseguito il codice all'interno delle parentesi.

if let constantName = someOptional { 
    statements 
} 

Non c'è modo di concatenare questa funzionalità in una dichiarazione if. let constantName = someOptional non valuta direttamente su un valore booleano. È meglio pensare a "se let" come parola chiave speciale.

+0

Ci scusiamo per aver modificato la domanda, ci vuole troppo bullismo per non parlare, si prega di vedere la modifica e se volere fornire alcune informazioni extra. –

+0

Nessun problema - aggiornato! – Dash

3

Il primo someOptional viene verificato per vedere se il suo nil o meno. Se non lo è, il valore constantName viene assegnato al valore unwrapped di someOptional. Se è nil, va alla dichiarazione else.

Ciò significa che, anche se è un someOptionalBool? che viene assegnato a false, esso sarà ancora andare in primo blocco, non il else.

Il video Intermediate Swift entra in profondità in questo argomento, nei primi 15 minuti!

+0

Ci scusiamo per aver modificato la domanda, ci sono voluti troppo bullismo per non parlare, si prega di vedere la modifica e se volere fornire alcune informazioni extra. –

1

Pensate in questo modo: Un optional è solo un Enum con un valore associato.

enum OptionalValue<T> { 
    case None 
    case Some(T) 
} 

Quando si assegna ad un optional, sotto il cofano il valore enum .Alcuni viene utilizzato, con un valore associato che ti ha dato. Se lo assegni a zero, viene assegnato il valore None, senza valore associato.

if let constantName = someOptional {} 

Fa l'enum. Se è. Qualcuno, alla costante viene assegnato il valore associato e il blocco viene eseguito. Altrimenti non succede nulla.

+0

Ci scusiamo per aver modificato la domanda, ci sono voluti troppo bullismo per non parlare, si prega di vedere la modifica e se volere fornire alcune informazioni extra. –

18

In Swift 1.2 e 2.1, si può fare questo:

if let constantName = someOptional, constantName2 = someOptional2 { 
    // statements 
} 
6

È non può catena opzionale vincolante in questo modo:

if let constantName = someOptional && constantName = someOptional2 {}

ma in Swift 1.2 si può scrivere questo:

if let constantName = someOptional, constantName = someOptional2 {}

cosa sta succedendo qui?

Gli optionals sono di tipo proprio e rappresentano il modo in cui Swift fornisce il controllo della compilazione per nil. Quando si digita var potentialValue : Int? non si utilizza alcun Int speciale, si utilizza il tipo Opzionale, che è essenzialmente un enum vuoto. Questo è il motivo per cui spesso è necessario scartare l'opzione con lo ! in quanto ciò consente di accedere a ciò che è all'interno (se c'è qualcosa all'interno). Se l'opzione non contiene alcun valore (ad esempio, l'enumerazione è vuota), ha un valore di None. Se l'opzione non è vuota, allora ha un valore di Some e un valore associato di qualsiasi tipo che stai usando - quindi in questo caso un Int.

Questo:

if (someOptional != nil){ 
    let constantName = someOptional! 
} 

è lo stesso che utilizza questo:

if let constantName = someOptional {} 

che si chiama opzionale vincolante. Noterai che la seconda versione qui è un po 'più leggibile e non è necessario scartare esplicitamente l'opzione usando lo !.

Viene valutato true quando il valore dell'opzione è Some e non None - in altre parole, quando l'opzione non è nulla. (Si noti che è ancora possibile verificare la presenza di nil se ti piace e si può anche cambiare il valore di un optional di nuovo a None scrivendo someOptional = nil.

Un'altra cosa che non è stato menzionato è che si può utilizzare ?? (chiamato il nil coalescing operator) per dare un un valore opzionale, se non ne ha uno. ad esempio:

let constantName = someOptional ?? 100 

Qui someOptional verrà scartato se ha un valore, ma se non lo fa, allora il valore 100 è usato al posto

Trovo utile ricordare che gli optionals sono il loro tipo in Swift. Non sono una versione elaborata del tipo che stai dicendo che contengono.

+0

Nota per i lettori: Il '==' nei primi due esempi di 'if let' dovrebbe essere un singolo' = '. – Noein

+0

'' 'Noterai che la seconda versione qui è un po 'più leggibile'''. Mi dispiace non essere d'accordo. La prima versione è molto più leggibile, ma la seconda versione è più concisa. Conciso non è sempre più leggibile – mradzinski

+0

@mradzinski Sì, la leggibilità è certamente soggettiva. – Gordonium

0

opzionale vincolante

Swift 2

if let constantName = someOptional, constantName2 = someOptional2 { 
       // your statement goes here ..... 
       print(constantName) 
       print(constantName2) 
      } 

rapida 3

if let constantName = someOptional, let constantName2 = someOptional2 { 
      // your statement goes here ..... 
      print(constantName) 
      print(constantName2) 
     } 
0
if let constantName = someOptional { 
    statements 
} 

Fondamentalmente ciò che accade è che se someOptional ha un non-nil valore, costanteN ad esempio viene assegnato un valore opzionale per lo scopo di questa istruzione if.

In termini di semantica, l'ordine di come le cose accadono è A) someOptional viene controllato per nil, B) e quindi viene assegnato a constantName, e quindi, infine, le istruzioni C) nel blocco if vengono eseguite.

In genere, il valore di qualcosa di simile è che impedisce all'app di arrestarsi in modo anomalo se altrimenti si ha un valore nullo. Vale la pena notare che il nullo in Swift se diverso da Objective-C perché è più potente di un semplice puntatore.

Inoltre, se someOptional è un Bool che è False, si noti che eseguirà ancora quel if-block perché non sta verificando per vero/falso ma piuttosto la presenza/assenza di valore. La presenza di False rende vero il blocco if.

0

da Apple Doc

opzionale Binding

Per associare in modo condizionale il valore avvolto di un'istanza opzionale per una nuova variabile, utilizzare una delle strutture di controllo vincolanti opzionali, tra cui se lasciate, guardia lasciare e cambia.

if let starPath = imagePaths["star"] { 
    print("The star image is at '\(starPath)'") 
} else { 
    print("Couldn't find the star image") 
} 

opzionale concatenamento

Per accedere in modo sicuro alle proprietà e metodi di un'istanza avvolto, utilizzare l'operatore postfisso concatenamento opzionale (suffisso?). Nell'esempio seguente viene utilizzato il concatenamento facoltativo per accedere al metodo hasSuffix (_ :) su una stringa? esempio.

 if let isPNG =imagePaths["star"]?.hasSuffix(".png") { 
      print("The star image is in PNG format") 
     } 
     // Prints "The star image is in PNG format" 
Problemi correlati