Downcast коллекций в switch: помните про цену 🍾

🔥 В Swift 5.8 наконец заработало case let buttons as [Button]: в паттерне. Формально это не пропозал, а багфикс (#56139): раньше компилятор отвечал «collection downcast in cast pattern is not implemented; use an explicit downcast to '[Button]' instead». Само views as? [Button] работало всегда — не хватало именно паттерн-формы.

⚠️ А теперь про цену, о которой в постах обычно молчат. _arrayConditionalCast в стандартной библиотеке проверяет каждый элемент — сложность O(n), это записано прямо в доке метода. И при совпадении он не просто отвечает «да», а собирает новый массив (reserveCapacity плюс поэлементный append). То есть каждый кейс — это копия, а не проверка. Упорядочивайте кейсы по стоимости.

⚠️ И главная ловушка: пустой массив проходит любой такой каст — цикл просто не выполняется и возвращается непустой результат. Значит [] молча попадёт в первый же collection-кейс, каким бы он ни был.

#Swift #iOSDevelopment #SwiftProgramming #PatternMatching #Performance

Downcast коллекций в switch: помните про цену 🍾 | Сетка — социальная сеть от hh.ru