ErrorNil. iOS-разработка
618 subscribers
254 photos
51 videos
16 files
298 links
Пишем код, разрабатываем приложения, учимся

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

По всем вопросам пишите мне @ibatyrgereev
Download Telegram
9️⃣ Каждый раз как в первый раз.

На этой недели прошел выпуск 9 потока! Ребята начали учиться с 17 сентября и 8 месяцев пролетело незаметно, но теперь на выходе получились специалисты с богатым стеком знаний. Когда заканчивается поток, всегда немного грустно, потому что за это время уже привыкаешь ко всем ученикам и с каждым всегда на связи) Но даже после выпуска, мы не перестаем работать с ними и всегда отвечаем по всем вопросам)

Всех учеников потока поздравляю, все большие молодцы, каждый из них не просто решил, что хочет стать IOS разработчиком, но и начали действовать, не откладывая и сегодня они уже готовы проходить собесы и получать оферы, главное не останавливаться на достигнутом!

Школа существует чуть больше 2х лет, а на носу старт 11 потока! Это говорит о том, что все больше людей хотят изменить свою жизнь, научиться чему-то новому, а главное, не ждут подходящего случая, не могу не порадоваться за это.

Всем, кто только хочет начать учиться или те кто уже учиться, хочу пожелать терпения и решимости: первым что бы собраться и сделать первый шаг, а вторым, чтобы пройти этот путь до конца!

🔥Спасибо всем, что выбираете нашу школу
Please open Telegram to view this post
VIEW IN TELEGRAM
26
Привет ребята!

На этой недели в школе сразу несколько запусков:

- Сегодня (15/04) начинается модуль по SwiftUI, если есть знание Swift, то можете сразу с него начать (бонусом записи уроков swift/uikit). После этого модуля будет модуль по разработке , который по желанию можно будет в этой группе пройти

- В четверг (17/04) стартует 11 поток. Ребят ждет 8 месяцев обучения, начиная с самых основ Swift и заканчивая полноценной разработкой и стажировкой. Пару мест в группе еще есть, следующий поток будет через два месяца и по новым ценам, так что если давно хотели начать учиться, сейчас самый подходящий момент

Как всегда по всем вопросам (@ibatyrgereev)
👍5💯1
Очень классные уроки у автора! Очень радует, что сообщество IOS растет, появляются новые авторы, поэтому поддержим канал, подписывайтесь на телегу и на ютуб, материал и правда очень классны)
👍3
+1 еще наш ученик в Яндексе)
🔥96🎉3
Сохраните себе в снипетах в xcode, код для валидации email

func isValidEmail(_ email: String) -> Bool {
let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return NSPredicate(format: "SELF MATCHES %@", regex).evaluate(with: email)
}
👍11🎉6🔥43
Полезный экстеншен для 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💯32
bankAppSwiftUI.zip
593.5 KB
Итоговый проект из видео выше
61👏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
🔥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
Сверстаем?
🔥30💯4
Механизм 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
Если еще остались вопросы, как это на самом деле работает, то пример на пальцах:
1 - У вас машина и документ на эту машину.
2 - Вы делаете копию этого документа и в итоге у вас ДВА документа на ОДНУ машину. Ничего существенно не изменилось
3 - Вы отдаете копию документа своему другу, он может точно так же, как и вы владеть одной конкретной машиной
4 - Ваш друг захотел что-то изменить в машине, к примеру тонировку, в этот момент ваша машина раздваивается, создается две одинаковые копии и на второй копии ваш друг тонирует окна и теперь в природе существуют две машины. Ваши документы предоставляют вам доступ к изначальной машине, документы ваше друга, но затонированную машину.

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

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

Если интересны подобные материалы по памяти в swift пишите тут в коменты свои варианты, постараюсь разобрать.
9
🎓 Привет ребята, в последнее время много вопросов по школе, поэтому тут ближайшее расписание вывешу:


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

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

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


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

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

По программе можно посмотреть на сайте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32