Выбор ответа Middle Протоколы, POP и дженерики обновлено
Протокол с associatedtype как тип параметра
Вопрос
Как принять в функцию любую коллекцию целых чисел, сохранив статическую типизацию и скорость?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: func sum( xs: some Collection<Int) - Int. У Collection есть associatedtype Element, и голое имя Collection в позиции типа не компилируется.
Варианты ответа
func sum(_ xs: some Collection<Int>) -> Intправильный ответfunc sum(_ xs: Collection) -> Int where Element == Intfunc sum(_ xs: [Any]) -> Intfunc sum(_ xs: AnyObject) -> Int
Разбор
У Collection есть associatedtype Element, и голое имя Collection в позиции типа не компилируется. С Swift 5.7 у протоколов бывают первичные associated types, поэтому можно писать some Collection<Int> (то же, что дженерик <C: Collection> с where C.Element == Int). [Any] теряет тип элементов и потребует приведения, AnyObject вообще про классы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Протоколы, POP и дженерики»
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift
- Type erasure в Swift
- Специализация дженериков
- Задача на Swift: k-й по величине в потоке через кучу