Интересное видео на канале, самое то для вечера субботы
YouTube
IOS Приложение на Clean Architecture + Combine. #swift #ios
в этом видео познакомимся с Clean Architecture и с Combine.
Напишем небольшое приложение, в котором все структурируем.
Подпишись, чтобы не пропустить новые видео
_____________________________________
О Школе - https://error-nil.com/
___________________…
Напишем небольшое приложение, в котором все структурируем.
Подпишись, чтобы не пропустить новые видео
_____________________________________
О Школе - https://error-nil.com/
___________________…
👍4
Полезный экстеншен для SwiftUI, что бы доставать цвета из hex
Как ипользовать
extension Color {
init(hex: String) {
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let a, r, g, b: UInt64
switch hex.count {
case 3:
(a, r, g, b) = (255,
(int >> 8) * 17,
(int >> 4 & 0xF) * 17,
(int & 0xF) * 17)
case 6:
(a, r, g, b) = (255,
int >> 16,
int >> 8 & 0xFF,
int & 0xFF)
case 8:
(a, r, g, b) = (int >> 24,
int >> 16 & 0xFF,
int >> 8 & 0xFF,
int & 0xFF)
default:
(a, r, g, b) = (255, 0, 0, 0)
}
self.init(
.sRGB,
red: Double(r) / 255,
green: Double(g) / 255,
blue: Double(b) / 255,
opacity: Double(a) / 255
)
}
}
Как ипользовать
let color1 = Color(hex: "#3498db") // Полный вариант
let color2 = Color(hex: "FF5733") // Без #
let color3 = Color(hex: "80FF5733") // С альфа каналом
let color4 = Color(hex: "fff") // Сокращенный вариант
🔥6💯3❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Верстка Банковского Приложения На SwiftUI
Подписывайся и пиши в комментах, что сверстать в следующем уроке?
Так же переходи в тг канала, все исходники будут там
https://t.me/error_nil - наш телеграм, где выкладываются все актуальные новости и не только
Конвертация с SVG - https://svg-to-swiftui.quassum.com/…
Так же переходи в тг канала, все исходники будут там
https://t.me/error_nil - наш телеграм, где выкладываются все актуальные новости и не только
Конвертация с SVG - https://svg-to-swiftui.quassum.com/…
❤5🔥4⚡1
Очень удобный код для поиска установленных шрифтов, на видео выше показал как использовать
for family in UIFont.familyNames.sorted() {
let names = UIFont.fontNames(forFamilyName: family)
print("Family: \(family) Font names: \(names)")
}
👍2
Иногда эти концепты выглядят интереснее, чем то, что предлагает потом Apple.
Но если хотя бы нам покажут что-то отдалено похожее на это, я бы сразу обновился, что думаете?
https://youtu.be/ffxDpOuAlDg?si=YGJtTiD4o7cflZDA
Но если хотя бы нам покажут что-то отдалено похожее на это, я бы сразу обновился, что думаете?
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…
Thanks so much to @_artyfex_ for letting…
🔥5
💻 Код, который позволит вам добавить на 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