any P для любого протокола — и одно правило 👏🏻
🔥 SE-0309 (Swift 5.7) снял запрет на экзистенциалы для протоколов с Self и associatedtype. Теперь any Configurable — легальный тип, даже если внутри есть ассоциированные типы. Правило доступности члена одно и оно точное: член можно вызвать на экзистенциале, если его тип — рассмотренный в контексте базового типа — не содержит Self или укоренённых в Self ассоциированных типов в нековариантной позиции. Ковариантность здесь белый список, а не интуиция: результат функции, элементы кортежа, Optional.Wrapped, Array.Element, Dictionary.Value. Dictionary.Key и Set.Element в него не входят. Отсюда практический вывод: any Equatable объявить можно, а вот вызвать == на двух таких значениях — нет. Компилятор не может доказать, что их динамические типы совпадают. SE-0352 тут не спасает по той же причине: для f<T: P>(_ a: T, _ b: T) согласованной привязки T может не существовать. Мелочь для точности: SE-0309 разблокировал протоколы-как-типы, а само написание any — это уже SE-0335.
#Swift #Generics #AdvancedSwift #iOSDevelopment #SwiftProgramming