Typeasting кортежи в быстром

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

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

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

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

1 ответ

Решение

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

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?' удрученный сломан

Другие вопросы по тегам