В коде допущена ошибка. Объясните её причину и покажите корректное место для объявления наследования протоколов.
protocol Readable { }
protocol Storable { }
extension Readable: Storable { }
База Hintsage
Protocols, extensions, associated types и generic constraints.
Практика
В коде допущена ошибка. Объясните её причину и покажите корректное место для объявления наследования протоколов.
protocol Readable { }
protocol Storable { }
extension Readable: Storable { }
В ситуации, когда generic-параметр должен быть экземпляром конкретного базового класса и соответствовать протоколу, как Swift применяет такое комбинированное ограничение?
Представьте generic-функцию, принимающую тип, который должен соответствовать двум протоколам одновременно. Какой доступ к требованиям этих протоколов получает её параметр?
Ситуация: тип соответствует двум протоколам с одинаковым требованием, но каждый протокол предоставляет свою реализацию по умолчанию. Как Swift разрешает такой конфликт?
Сравните any P.Type и (any P).Type: какой из этих типов представляет метатип конкретного типа, соответствующего протоколу, а какой — метатип самого existential-типа?
Представьте, что протокол объявляет метод, принимающий значение того же типа Self. Почему такой метод нельзя напрямую вызвать через existentialное значение этого протокола?
Как классовое ограничение протокола меняет допустимые типы и возможности generic-кода?
Как Swift выбирает реализацию требования протокола, если в его расширении есть default implementation, а соответствующий тип объявляет собственную?
На каком этапе Swift выбирает наиболее специализированную generic-перегрузку, если подходят несколько ограничений протоколами?
В коде нужно передать значение any Sequence в generic-функцию. Объясните, почему вызов total допустим, несмотря на наличие associated type Element.
func total<S: Sequence>(_ sequence: S) -> Int {
sequence.reduce(0) { result, _ in result + 1 }
}
let values: any Sequence = [10, 20, 30]
let count = total(values)
Допустим, нужно хранить в одной коллекции разные реализации протокола с associated type. Как type erasure решает эту задачу?
Проведите границу: делает ли ограничение в where расширения протокола обязательным условием соответствия этому протоколу?
Сравните ограничение generic-параметра соответствием протоколу с ограничением его равенством конкретному типу: как каждое влияет на допустимые аргументы и доступные операции?
В чём принципиальное отличие generic-параметра протокола от associated type, если каждый из них связывает протокол с типом?
Как работает значение по умолчанию для associated type, если соответствующий тип можно вывести из реализации протокола?
Может ли тип, соответствующий родительскому протоколу, автоматически считаться соответствующим протоколу, который его расширяет?
Когда в протоколе следует выбрать associated type вместо generic-параметра метода для типа, связанного с конкретной реализацией?
Что произойдёт, если для одного generic-типа объявить две условные конформности к одному протоколу с разными ограничениями?
Сравните ограничения на типы коллекций: почему вызов этой функции допустим для Array и Set, хотя сами типы коллекций различаются?
func combined<A: Collection, B: Collection>(
_ first: A,
_ second: B
) -> [A.Element]
where A.Element == B.Element {
Array(first) + Array(second)
}
let result = combined([1, 2], Set([3, 4]))
Представьте generic-функцию с двумя параметрами, каждый из которых ограничен протоколом Equatable. Может ли она напрямую сравнить эти параметры?
Показано 21–40 из 50