2016-07-17 2 views
2

Я пытаюсь без успеха развернуть и наложить несколько опций с помощью кортежей. Странная вещь заключается в том, что разворачиваются отдельные предметы. Было высказано предположение, что я злоупотребляю downcast as? operator, , и это очень вероятно, но я просто не вижу его.typecasting tuples in swift

Может кто-нибудь объяснить, почему это не работает?

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()) 

Я не думаю, что это дубликат tuple "upcasting", , потому что разве я не понижающее приведение? Во всяком случае, объяснение того, как именно дублируются , было бы освещением и ответом само по себе.

+0

Возможного дубликат [кортежи «в» приведении к базовому типу Swift] (http://stackoverflow.com/questions/31270507/tuple-upcasting-in-swift) –

ответ

1

Вместо отдельно пытается соответствовать каждому компоненту с, если пусть комбинации, вы можете просто сделать то же самое в более быстром-й способ:

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 
} 

Заметим также, что тип потупив вы пытаетесь сделать это в настоящее время невозможно - посмотреть на этой стремительной ошибке: tuple 'as?' downcast broken

+0

Спасибо ! Это сработало, и в качестве бонуса мне удалось отбросить «AnyObject?» Обратно на «Any?», А теперь «Int», а также «fooba's». –