💻 Код, который позволит вам добавить на UIViewController вьюху из SwiftUI
let content = UIHostingController(rootView: /*SwiftUIView*/ )
addChild(content)
content.view.frame = view.frame
view.addSubview(content.view)
content.didMove(toParent: self)
👍5💯3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Механизм CoW в Swift
Всем известна простая истина, что в Swift структуры у нас value type, а классы (еще и функции и клоужеры и actor) являются reference type. Все четко.
Про value и reference не буду распинаться, все знают, что это и как работает. Если на пальцах это означает что:
Это у нас value type (Int -> Struct) и value соответственно хранится в стеке.
Справедливо и то, что в следующем коде:
user ссылается на область в куче
Пока ничего криминального и все очевидно. Тогда, о чем тут речь?
Допустим у нас есть следующий код:
justiceLeague - массив, массив это структура
Соответственно justiceLeague хранится в стеке, так? Ну в целом так-то оно так, но не совсем.
Так как массив может содержать довольно много элементов в Swift (но уверен, что и в некоторых других языках тоже) в качестве оптимизации придумали механизм, который называется Copy on Write или проще CoW. Так в чем же суть и причем тут массивы?
А идея заключается в том, что все коллекции, а это у нас массивы, множества (Set), словари (Dictionary) и строки (String, да, это тоже коллекция, вернее массив из Character) хранятся сами в стеке, как и положено value type, но значения их находятся в куче. Что это значит?
К примеру, возьмём наш исходный массив и скопируем его:
В данном случае у нас есть две переменные justiceLeague и suicideSquad, по принципам value type у нас происходит копирования из justiceLeague -> suicideSquad и в итоге у них сейчас данные одинаковые, вот в этом и есть камень преткновения.
Дело в том, как я и сказал ранее, для оптимизации решили сделать так, зачем сразу создавать две копии, если мы за весь жизненный цикл программы можем и не поменять данные нашей копии, а вдруг они у нас такими и останутся, поэтому и добавили механизм CoW, название которого и говорит само за себя, Копировать во время Записи. Как это работает?
justiceLeague - хранится в стеке, тут без криминала, но все данные (["Batmant","Supermen", "Wonder woman"]) отправляются в кучу и возвращается указатель на область памяти, откуда мы эти данные можем достать. И когда мы написали
Случилось так, что теперь и justiceLeague и suicideSquad ссылаются на один и тот же участок памяти в куче. Отсюда следует, что у нас на один участок в памяти создано две ссылки.
Но теперь мы хотим изменить данные, что в этом случае происходит.
Допустим мы написали следующий код:
При выполнении suicideSquad.append("Green Arrow") Swift проверяет:
- Если количество ссылок > 1, то данные копируются в новую область кучи и теперь justiceLeague и suicideSquad указывают на разные массивы:
- Если же, количество ссылок == 1 то мы бы просто изменили массив в куче без копирования.
За проверку ссылок в данном случае отвечает встроенная функция isKnownUniquelyReferenced, которая возращает:
true - если ссылка уникальная
false - если есть и другие владельцы.
При помощи этой функции мы можем любую структуру сделать по принципу CoW, вопрос в том, нафига, но такое можно сделать, тут не буду писать код, в целом это распространённое решение, думаю найдете.
Всем известна простая истина, что в Swift структуры у нас value type, а классы (еще и функции и клоужеры и actor) являются reference type. Все четко.
Про value и reference не буду распинаться, все знают, что это и как работает. Если на пальцах это означает что:
let age: Int = 30
Это у нас value type (Int -> Struct) и value соответственно хранится в стеке.
Справедливо и то, что в следующем коде:
class User {
var name: String
init(name: String){
self.name = name
}
}
let user = User(name: "Superman")
user ссылается на область в куче
class -> reference type -> heap
Пока ничего криминального и все очевидно. Тогда, о чем тут речь?
Допустим у нас есть следующий код:
var justiceLeague: [String] = ["Batmant","Supermen", "Wonder woman"]
justiceLeague - массив, массив это структура
public struct Array<Element>
Соответственно justiceLeague хранится в стеке, так? Ну в целом так-то оно так, но не совсем.
Так как массив может содержать довольно много элементов в Swift (но уверен, что и в некоторых других языках тоже) в качестве оптимизации придумали механизм, который называется Copy on Write или проще CoW. Так в чем же суть и причем тут массивы?
А идея заключается в том, что все коллекции, а это у нас массивы, множества (Set), словари (Dictionary) и строки (String, да, это тоже коллекция, вернее массив из Character) хранятся сами в стеке, как и положено value type, но значения их находятся в куче. Что это значит?
К примеру, возьмём наш исходный массив и скопируем его:
var justiceLeague: [String] = ["Batmant","Supermen", "Wonder woman"]
var suicideSquad = justiceLeague
В данном случае у нас есть две переменные justiceLeague и suicideSquad, по принципам value type у нас происходит копирования из justiceLeague -> suicideSquad и в итоге у них сейчас данные одинаковые, вот в этом и есть камень преткновения.
Дело в том, как я и сказал ранее, для оптимизации решили сделать так, зачем сразу создавать две копии, если мы за весь жизненный цикл программы можем и не поменять данные нашей копии, а вдруг они у нас такими и останутся, поэтому и добавили механизм CoW, название которого и говорит само за себя, Копировать во время Записи. Как это работает?
justiceLeague - хранится в стеке, тут без криминала, но все данные (["Batmant","Supermen", "Wonder woman"]) отправляются в кучу и возвращается указатель на область памяти, откуда мы эти данные можем достать. И когда мы написали
var suicideSquad = justiceLeague
Случилось так, что теперь и justiceLeague и suicideSquad ссылаются на один и тот же участок памяти в куче. Отсюда следует, что у нас на один участок в памяти создано две ссылки.
Но теперь мы хотим изменить данные, что в этом случае происходит.
Допустим мы написали следующий код:
var justiceLeague: [String] = ["Batmant","Supermen", "Wonder woman"]
var suicideSquad = justiceLeague
suicideSquad.append("Green Arrow")
При выполнении suicideSquad.append("Green Arrow") Swift проверяет:
- Если количество ссылок > 1, то данные копируются в новую область кучи и теперь justiceLeague и suicideSquad указывают на разные массивы:
justiceLeague (Стек) -> ["Batmant","Supermen", "Wonder woman"] (Куча)
suicideSquad (Стек) -> ["Batmant","Supermen", "Wonder woman", "Green Arrow"] (Куча)
- Если же, количество ссылок == 1 то мы бы просто изменили массив в куче без копирования.
За проверку ссылок в данном случае отвечает встроенная функция isKnownUniquelyReferenced, которая возращает:
true - если ссылка уникальная
false - если есть и другие владельцы.
func isKnownUniquelyReferenced<T>(_ object: inout T?) -> Bool where T : AnyObject
При помощи этой функции мы можем любую структуру сделать по принципу CoW, вопрос в том, нафига, но такое можно сделать, тут не буду писать код, в целом это распространённое решение, думаю найдете.
❤4🔥2
Если еще остались вопросы, как это на самом деле работает, то пример на пальцах:
1 - У вас машина и документ на эту машину.
2 - Вы делаете копию этого документа и в итоге у вас ДВА документа на ОДНУ машину. Ничего существенно не изменилось
3 - Вы отдаете копию документа своему другу, он может точно так же, как и вы владеть одной конкретной машиной
4 - Ваш друг захотел что-то изменить в машине, к примеру тонировку, в этот момент ваша машина раздваивается, создается две одинаковые копии и на второй копии ваш друг тонирует окна и теперь в природе существуют две машины. Ваши документы предоставляют вам доступ к изначальной машине, документы ваше друга, но затонированную машину.
Кcтати, кроме коллекций тип Data тоже поддерживает CoW.
Никто, конечно, не просил, но хотелось поделиться и теперь надеюсь будет понимание того, что такое CoW и как на самом деле работают коллекции, так же это частый вопрос на собесах.
Если интересны подобные материалы по памяти в swift пишите тут в коменты свои варианты, постараюсь разобрать.
1 - У вас машина и документ на эту машину.
2 - Вы делаете копию этого документа и в итоге у вас ДВА документа на ОДНУ машину. Ничего существенно не изменилось
3 - Вы отдаете копию документа своему другу, он может точно так же, как и вы владеть одной конкретной машиной
4 - Ваш друг захотел что-то изменить в машине, к примеру тонировку, в этот момент ваша машина раздваивается, создается две одинаковые копии и на второй копии ваш друг тонирует окна и теперь в природе существуют две машины. Ваши документы предоставляют вам доступ к изначальной машине, документы ваше друга, но затонированную машину.
Кcтати, кроме коллекций тип Data тоже поддерживает CoW.
Никто, конечно, не просил, но хотелось поделиться и теперь надеюсь будет понимание того, что такое CoW и как на самом деле работают коллекции, так же это частый вопрос на собесах.
Если интересны подобные материалы по памяти в swift пишите тут в коменты свои варианты, постараюсь разобрать.
❤9
По всем вопросам вот сюда
По программе можно посмотреть на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
error-nil.namari.ru
Error Nil - школа IOS разработки
Доступный курс по IOS разработке
🔥3❤2
ErrorNil. iOS-разработка
Сверстаем?
Наконец-то руки дошли, верстаем этот проект
YouTube
Верстка Игрового Приложения На SwiftUI
Подписывайся и пиши в комментах, что сверстать в следующем уроке?
Так же переходи в тг канала, все исходники будут там
https://t.me/error_nil - наш телеграм, где выкладываются все актуальные новости и не только
Предыдущий ролик https://youtu.be/jq6R6fNfgJg…
Так же переходи в тг канала, все исходники будут там
https://t.me/error_nil - наш телеграм, где выкладываются все актуальные новости и не только
Предыдущий ролик https://youtu.be/jq6R6fNfgJg…
🔥5⚡1🎉1
ErrorNil. iOS-разработка
Наконец-то руки дошли, верстаем этот проект
Решил в кой то веки проекты на гит выкладывать.
👉 Вот тут лежит проект с этого видео
👉 Вот тут лежит проект с этого видео
GitHub
GitHub - rwrun/gameAppLayoutSwiftUI
Contribute to rwrun/gameAppLayoutSwiftUI development by creating an account on GitHub.
👍5❤3
Ребята вопрос, видео на канале выходят как правило длиные, и мне кажется, что это не всегда удобно, за раз такой большой ролик посмотреть, поэтому поделитесь, какова оптимальная длина урока для вас? Либо свой ответ в коментах, спасибо)
Anonymous Poll
0%
До 10 минут
20%
От 10 до 30 минут
39%
от 30 до часу
15%
от 1 до 1.5 часов
26%
чем длиннее тем лучше
👍3
Сегодня на WWDC25 ожидается, что Apple покажет редизайн системы, которая будет по значимости такой же как с ios 6 на ios 7. И так же теперь у нас будет новый нейминг, ios 26, сегодня увидим, хочется уже чего нибудь нового, а то последние пару лет Apple мягко говоря расстраивает.
А чего вы ждете от этой презентации?
А чего вы ждете от этой презентации?
🔥9
Apple преисполнилась и наконец-то дала что-то свежее!
Хочется конечно в живую пощупать, но уже выглядит очень даже)
А как вам?
Хочется конечно в живую пощупать, но уже выглядит очень даже)
А как вам?
🔥8
Но как разработчика меня пока это больще радует, Apple даст доступы к этим API, пока не знаю куда это хочу воткнуть, но уже ручки чешутся))
👍3