TGViewer
Channel Public Channel
ErrorNil. iOS-разработка

ErrorNil. iOS-разработка

@error_nil

Пишем код, разрабатываем приложения, учимся

Сайт школы https://error-nil.namari.ru/
YouTube https://www.youtube.com/@errornil
VK Видео - https://vk.com/video/@errornil

По всем вопросам пишите мне @ibatyrgereev
Subscribers
688
Photos
298
Videos
60
Links
332

Showing posts older than #540 · Back to latest

Older Posts 15 shown
Post #531 303
Apple преисполнилась и наконец-то дала что-то свежее!
Хочется конечно в живую пощупать, но уже выглядит очень даже)

А как вам?
  • 🔥 8
Post #530 294
Сегодня на WWDC25 ожидается, что Apple покажет редизайн системы, которая будет по значимости такой же как с ios 6 на ios 7. И так же теперь у нас будет новый нейминг, ios 26, сегодня увидим, хочется уже чего нибудь нового, а то последние пару лет Apple мягко говоря расстраивает.

А чего вы ждете от этой презентации?
  • 🔥 9
Post #529 368
  • 👍 3
Post #527 330
Post #526 316
🎓 Привет ребята, в последнее время много вопросов по школе, поэтому тут ближайшее расписание вывешу:


🔣 3.06 - Стартует модуль по разработке (Запросы в сеть, база данных и все необходимое, что бы написать полноценное приложение)

🔣 9.06 - Начинается модуль по UIKit (Кит мы любим и с самых основ учим)

🔣 1.07 (Ориентировочно, но не точно) - 12 поток, полностью с нуля всю программу


📱 По поводу контента на канале, новое видео с версткой на SwiftUI скоро будет

По всем вопросам вот сюда 👉 @ibatyrgereev

По программе можно посмотреть на сайте
Error-Nil Error Nil - школа IOS разработки Доступный курс по IOS разработке
  • 🔥 3
  • ❤ 2
Post #525 400
Если еще остались вопросы, как это на самом деле работает, то пример на пальцах:
1 - У вас машина и документ на эту машину.
2 - Вы делаете копию этого документа и в итоге у вас ДВА документа на ОДНУ машину. Ничего существенно не изменилось
3 - Вы отдаете копию документа своему другу, он может точно так же, как и вы владеть одной конкретной машиной
4 - Ваш друг захотел что-то изменить в машине, к примеру тонировку, в этот момент ваша машина раздваивается, создается две одинаковые копии и на второй копии ваш друг тонирует окна и теперь в природе существуют две машины. Ваши документы предоставляют вам доступ к изначальной машине, документы ваше друга, но затонированную машину.

Кcтати, кроме коллекций тип Data тоже поддерживает CoW.

Никто, конечно, не просил, но хотелось поделиться и теперь надеюсь будет понимание того, что такое CoW и как на самом деле работают коллекции, так же это частый вопрос на собесах.

Если интересны подобные материалы по памяти в swift пишите тут в коменты свои варианты, постараюсь разобрать.
  • ❤ 9
Post #524 367
Механизм CoW в Swift

Всем известна простая истина, что в 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
Post #523 343
Сверстаем?
  • 🔥 30
  • 💯 4
Post #522 385
🤦А сколько у вас?
  • 👍 1
Post #520 462
💻 Код, который позволит вам добавить на UIViewController вьюху из SwiftUI


let content = UIHostingController(rootView: /*SwiftUIView*/ )
addChild(content)
content.view.frame = view.frame
view.addSubview(content.view)
content.didMove(toParent: self)
  • 👍 5
  • 💯 3
Post #519 415
Иногда эти концепты выглядят интереснее, чем то, что предлагает потом Apple.
Но если хотя бы нам покажут что-то отдалено похожее на это, я бы сразу обновился, что думаете?

https://youtu.be/ffxDpOuAlDg?si=YGJtTiD4o7cflZDA
YouTube Meet iOS 19 | Apple Apple is set to announce iOS 19 in just a few weeks at WWDC! I wanted to make this concept based on the leaks and rumors of what we can expect Apple to announce, plus features that I'd personally like to see added. Thanks so much to @_artyfex_ for letting…
  • 🔥 5
Post #518 403
Очень удобный код для поиска установленных шрифтов, на видео выше показал как использовать


for family in UIFont.familyNames.sorted() {
let names = UIFont.fontNames(forFamilyName: family)
print("Family: \(family) Font names: \(names)")
}
  • 👍 2
Post #516 374
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →