172 похожих чатов

Привет всем Начал изучать swift и застрял на opaque types.


Может кто то обяснить или дать хорошую ссылку?
Пишу на dart , go lang.

9 ответов

8 просмотров

https://habr.com/ru/company/otus/blog/542080/ читал?

Євгеній-Сергійович Автор вопроса
Руслан Иваныкин
https://habr.com/ru/company/otus/blog/542080/ чита...

Да, но что то не понял в чем суть. Что то на интерфейс похоже

Євгеній Сергійович
Да, но что то не понял в чем суть. Что то на интер...

в каком смысле? Нет, это не имеет отношения к UI, просто в swiftUI метод body возвращает у вьюхи some View, но это языковая конструкция, так называемое стирание информации о типе

Євгеній-Сергійович Автор вопроса
Руслан Иваныкин
в каком смысле? Нет, это не имеет отношения к UI, ...

Я имел в веду протокол, он в других япах интерфейсом називается

Євгеній Сергійович
Я имел в веду протокол, он в других япах интерфейс...

https://swiftbook.ru/content/languageguide/opaque-types/https://swiftbook.ru/content/languageguide/opaque-types/ и тут непонятно?

Тут нужно начать с понимания двух других вещей, это протоколы с ассоциативными значениями - PATs и экзистенциальные типы - Existentials. PATs - сильно упрощённо, это дженерик интерфейсы. Existentials - типы, которые могут выступать в качестве абстрактных типов И при этом являться полноценными типами. Обычные протоколы, не путать с PATs, являются экзистенциальными типами, тогда как PATs ими не являются. _ _ ___ Обычные протоколы являются и абстрактными типами и полноценными типами: protocol P { } func foo(_: P) ✅ class Class: P { } let p: P = Class() ✅ _ _ ___ PATs являются абстрактными типами, но не могут выступать в качестве полноценных типов, а могут служить лишь ограничениями protocol P { associatedtype A } func foo(_: P) ❌ func foo<T: P>(_: T) ✅ class Class: P { } let p: P = Class() ❌ protocol 'P' can only be used as a generic constraint because it has Self or associated type requirements. _ _ ___ С самого появления PATs в языке, будучи не Existentials типами, приходилось пользоваться такими конструкциями как Type Erasure, некий бокс, который мог содержать в себе PATs и работать в качестве полноценных типов. В стандартной библиотеке Swift таких боксов очень много: protocol Hashable - PAT struct AnyHashable - его Type Erasure protocol Collection - PAT struct AnyCollection<Element> - его Type Erasure и т.д. _ _ ___ А вот с приходом SwiftUI это проблема стала куда более острой уже для самих разработчиков языка. Конструкция Opaque Result Types отчасти пришла решить проблемы. Opaque Result Types - говоря просто, это обычный ревёрс дженерик. Если в дженериках, лишь вызывающая сторона знает конкретный тип, тогда как сама реализация его не знает. То в ревёрс дженериках всё наоборот, вызывающая сторона не знает конкретного типа, а реализия знает. На примере: Дженерики: func foo<T: P>(_: T) { // Мы не знаем конкретный тип T } foo<Class>(…) // А вот вызывающая сторона его знает. Реверс Дженерики: func foo() -> some P { // … return Class() // Теперь реализация знает конкретный тип } let p: P = foo() // Но вызывающая сторона не знает. _ _ ___ Opaque Result Types частично решают проблемы описанные в самом начале, они позволяют сделать PATs - экзистенциальными типами. То есть теперь та мы можем писать так: func foo() -> some Collection { … } class Class { var collection: some Collection { … } } НО на данном этапе у Opaque Result Types есть ограничения. Они не могут выступать в качестве аргументов для методов и функций и не могут быть использованы внутри протоколов и т.д. _ _ ___ Opaque Result Types решают также и проблему излишней verbosity, актуальной для SwiftUI. Тогда как в SwiftUI большая часть типов являются типами значений, то вместо наследования используется композиция. Что выливается обычно в нечто подобное: До: struct MyView: View { var body: A<B1, C1<D1, D2<E1, E2<…>>>> { // излишняя verbosity } } После: struct MyView: View { var body: some View { // излишняя verbosity исчезла } } _ _ ___ Opaque Result Types также позволяют скрывать внутренние типы реализация от посторонних глаз. func buttonBorderShape(_ shape: ButtonBorderShape) -> some View // какие там внутренние типы обертки используются и возвращаются нам неизвестно, мы знаем лишь о some View

Євгеній-Сергійович Автор вопроса
Руслан Лутфуллин
Тут нужно начать с понимания двух других вещей, эт...

Круто, спасибо большое за обяснение. Вы очень доходчиво все описали👍🏻👍🏻

Похожие вопросы

Обсуждают сегодня

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Коллеги, как получить PId для собственного процесса из под линукса?
Роман Лях (rgreat)
6
Карта сайта