Общие вопросы
Смешанные вопросы по Swift.
Открыть разделБаза Hintsage
Язык Swift и разработка приложений в экосистеме Apple.
Темы раздела
Смешанные вопросы по Swift.
Открыть разделТипы, функции, структуры, классы и базовая семантика.
Открыть разделOptionals, value/reference semantics, casting и pattern matching.
Открыть разделProtocols, extensions, associated types и generic constraints.
Открыть разделCollections, closures, map/filter/reduce и sequences.
Открыть разделARC, reference cycles, weak/unowned и время жизни объектов.
Открыть разделasync/await, actors, tasks и безопасность данных.
Открыть разделthrows, Result, defer и моделирование ошибок.
Открыть разделПрактика
На каком этапе Swift выбирает наиболее специализированную generic-перегрузку, если подходят несколько ограничений протоколами?
Как Swift выбирает реализацию требования протокола, если в его расширении есть default implementation, а соответствующий тип объявляет собственную?
Как классовое ограничение протокола меняет допустимые типы и возможности generic-кода?
Представьте, что протокол объявляет метод, принимающий значение того же типа Self. Почему такой метод нельзя напрямую вызвать через existentialное значение этого протокола?
Сравните any P.Type и (any P).Type: какой из этих типов представляет метатип конкретного типа, соответствующего протоколу, а какой — метатип самого existential-типа?
Ситуация: тип соответствует двум протоколам с одинаковым требованием, но каждый протокол предоставляет свою реализацию по умолчанию. Как Swift разрешает такой конфликт?
Представьте generic-функцию, принимающую тип, который должен соответствовать двум протоколам одновременно. Какой доступ к требованиям этих протоколов получает её параметр?
В ситуации, когда generic-параметр должен быть экземпляром конкретного базового класса и соответствовать протоколу, как Swift применяет такое комбинированное ограничение?
В коде допущена ошибка. Объясните её причину и покажите корректное место для объявления наследования протоколов.
protocol Readable { }
protocol Storable { }
extension Readable: Storable { }
Из-за чего метод в ограниченном расширении generic-типа недоступен в коде, где соответствующее ограничение не доказано?
В generic-функции параметр ограничен составным протоколом: можно ли считать associated types из этих протоколов одним и тем же типом без явного ограничения равенства?
Почему новое обязательное требование нельзя добавить в extension уже объявленного протокола?
Что даёт объявление primary associated type при использовании протокола как existential-типа?
Ситуация: тип объявляет соответствие протоколу только в extension. Почему generic-функция всё равно принимает его как параметр с ограничением этим протоколом?
Через existential-значение протокола вызывается реализация метода из расширения или одноимённый метод конкретного типа, если этот метод не объявлен требованием протокола?
При передаче значения any-протокола в generic-функцию каким образом Swift связывает его скрытый конкретный тип с generic-параметром?
К чему приводит добавление в extension соответствия типа из чужой библиотеки протоколу, которым владеет текущий модуль?
В коде обобщённая функция принимает неизвестный конкретный тип. За счёт какого требования протокола вызов T(copying: value) допустим?
protocol Copyable {
init(copying: Self)
}
struct Note: Copyable {
let value: Int
init(copying other: Note) {
value = other.value
}
}
func clone<T: Copyable>(_ value: T) -> T {
T(copying: value)
}
Практическая ситуация: если обобщённый контейнер условно соответствует протоколу при соответствии его элемента, при каких условиях вложенный такой же контейнер тоже получает это соответствие?
Объясните различие между existential-протоколом с зафиксированным primary associated type и generic-параметром с тем же ограничением: что сохраняется статически?
Показано 121–140 из 651