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