L’utilizzo di più ha lasciato-come all’interno di un se-istruzione in Swift

Sto scartare due valori da un dizionario e prima di usarli devo cast di loro e verificare il tipo giusto. Questo è quello che ho pensato è:

var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]

if let latitudeDouble = latitude as? Double  {
   if let longitudeDouble = longitude as? Double {
       //do stuff here
   }
}

Ma vorrei pack due se lasciate le query in una sola. In modo che sarebbe qualcosa di simile:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    //do stuff here
}

Che la sintassi non funziona, quindi mi chiedevo se c’era un bel modo per farlo.

InformationsquelleAutor suntoch | 2014-07-06



3 Replies
  1. 280

    Aggiornamento per Swift 3:

    Il seguente lavoro di Swift 3:

    if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
        //latitudeDouble and longitudeDouble are non-optional in here
    }

    Basta essere sicuri di ricordare che se uno dei due ha tentato opzionale associazioni di esito negativo, il codice all’interno del if-let blocco non sarà eseguita.

    Nota: le clausole non devono essere ‘let’ clausole, si può avere qualsiasi serie di boolean controlli separati da virgole.

    Per esempio:

    if let latitudeDouble = latitude as? Double, importantThing == true {
        //latitudeDouble is non-optional in here and importantThing is true
    }

    Swift 1.2:

    Apple potrebbe aver letto la tua domanda, perché il tuo attesa per il codice viene compilato correttamente in Swift 1.2 (in versione beta oggi):

    if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
        //do stuff here
    }

    Swift 1.1 e versioni precedenti:

    Ecco la buona notizia – si può assolutamente fare questo. Un’istruzione switch su una tupla di due valori possono utilizzare il pattern-matching per il cast di entrambi a Double allo stesso tempo:

    var latitude: Any! = imageDictionary["latitude"]
    var longitude: Any! = imageDictionary["longitude"]
    
    switch (latitude, longitude) {
    case let (lat as Double, long as Double):
        println("lat: \(lat), long: \(long)")
    default:
        println("Couldn't understand latitude or longitude as Double")
    }

    Aggiornamento: Questa versione del codice ora funziona correttamente.

    • Non funziona in Xcode 6.1.1 sia 🙁
    • a me funziona in 6.1.1, @AaronBratcher perché non si?
    • Controllo swiftstub.com/569478972
    • Il codice aggiornato ora funziona correttamente. 😊
    • In Swift 1.2, è possibile ora fare questo in una sola riga: stackoverflow.com/a/28418847/1698576
    • Nel codice, si hanno 2 optionals essere da scartare. Sta per essere usato sempre così? Ho diverse confusione codice. if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window {...}. È la 2 let anche opzionale vincolante? Voglio dire app non è più un optional. giusto?
    • È. app non è più un optional, ma la sua window proprietà è (il suo tipo è UIWindow?), in modo che tu non riesci a scartare.

  2. 6

    Con celere 3, è possibile utilizzare opzionale concatenamento, istruzione switch opzionale o un modello per risolvere il tuo problema.


    1. Utilizzando if let (opzionale associazione /opzionale a catena)

    Il Linguaggio Di Programmazione Swift stati circa opzionale catena:

    Più query possono essere concatenati, e tutta la catena non riesce con garbo se ogni anello della catena è pari a zero.

    Pertanto, nel caso più semplice, è possibile utilizzare il seguente schema per l’utilizzo di più query opzionale concatenamento di funzionamento:

    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    if let latitude = latitude as? Double, let longitude = longitude as? Double {
        print(latitude, longitude)
    }
    
    // prints: 2.0 10.0

    2. Utilizzando le tuple e valore vincolante in un’istruzione switch

    Come alternativa alla semplice opzionale concatenamento, istruzione switch in grado di offrire a grana soluzione quando utilizzato con tuple e valore vincolante:

    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    switch (latitude, longitude) {
    case let (Optional.some(latitude as Double), Optional.some(longitude as Double)):
        print(latitude, longitude)
    default:
        break
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    switch (latitude, longitude) {
    case let (latitude as Double, longitude as Double):
        print(latitude, longitude)
    default:
        break
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    switch (latitude as? Double, longitude as? Double) {
    case let (.some(latitude), .some(longitude)):
        print(latitude, longitude)
    default:
        break
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    switch (latitude as? Double, longitude as? Double) {
    case let (latitude?, longitude?):
        print(latitude, longitude)
    default:
        break
    }
    
    // prints: 2.0 10.0

    3. Utilizzando le tuple con if case (opzionale modello)

    if case (optional modello) fornisce un modo conveniente per scartare i valori opzionali enumerazione. Si può utilizzare con le tuple per eseguire alcune opzionale concatenamento con più query:

    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    if case let (.some(latitude as Double), .some(longitude as Double)) = (latitude, longitude) {
        print(latitude, longitude)
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    if case let (latitude as Double, longitude as Double) = (latitude, longitude) {
        print(latitude, longitude)
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    if case let (.some(latitude), .some(longitude)) = (latitude as? Double, longitude as? Double) {
        print(latitude, longitude)
    }
    
    // prints: 2.0 10.0
    let dict = ["latitude": 2.0 as AnyObject?, "longitude": 10.0 as AnyObject?]
    let latitude = dict["latitude"]
    let longitude = dict["longitude"]
    
    if case let (latitude?, longitude?) = (latitude as? Double, longitude as? Double) {
        print(latitude, longitude)
    }
    
    // prints: 2.0 10.0
  3. 5

    Swift 3.0

    if let latitudeDouble = latitude as? Double, let longitudeDouble = longitude as? Double {
        //do stuff here
    }
    • Si dovrebbe suggerire una modifica accettato di rispondere, non aggiungere un altro di qualità inferiore risposta.

Lascia un commento