2016-07-17 10 views
2

Ich versuche ohne Erfolg, mehrere Optionen über Tupel auszupacken und zu werfen. Das seltsame ist, dass das Auspacken einzelner Elemente funktioniert. Es wurde vorgeschlagen, dass ich die downcast as? operator, missbrauche und das ist sehr wahrscheinlich, aber ich kann es einfach nicht sehen.typecasting Tupel in swift

Kann jemand erklären, warum das nicht funktioniert?

class fooba { } 

func unwrapPair(a: AnyObject?, _ b:AnyObject?) { 
    if let a = a as? fooba { 
     // true 
    } 

    if let b = b as? fooba { 
     // true 
    } 

    if let (a, b) = (a, b) as? (fooba, fooba) { 
     // false!?!? 
    } 
} 
unwrapPair(fooba(), fooba()) 

ich nicht denken dies ein Duplikat tuple "upcasting" ist, weil nicht ich einziehe? Auf jeden Fall wäre die Erklärung, wie genau sie sind, leuchtend und eine Antwort für sich. wenn-let Kombinationen

+0

Mögliches Duplikat von [Tuple "upcasting" in Swift] (http://stackoverflow.com/questions/31270507/tuple-upcasting-in-swift) –

Antwort

1

Statt separat zu versuchen, jede Komponente mit übereinstimmen, können Sie nur das gleiche in einer swift-y Weg:

switch (a, b) { 
case (let a as String, _): 
    // Do whatever you need to do with a 
    return true 
case (_, let b as String): 
    // Do whatever you need to do with b 
    return true 
case (let a as NSNumber, let b as NSNumber): 
    // Do whatever you need to do with a and b 
    return false 
default: 
    return true 
} 

Beachten Sie auch, dass die Art der gesenkten Sie versuchen, Do ist derzeit unmöglich - sieh dir diesen schnellen Fehler an: tuple 'as?' downcast broken

+0

Vielen Dank ! Das hat funktioniert, und als Bonus konnte ich 'AnyObject' wieder zurück auf' Any? 'Und jetzt' Int's Arbeit sowie 'Fooba' setzen. –