Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
127 photos
21 videos
9 files
84 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Большая тема впереди

➡️Day 9: Closures, passing functions into functions, and checkpoint 5

В переменной можно хранить функцию:

func greetUser() {
print("Hi there!")
}

greetUser()

var greetCopy = greetUser
greetCopy()

📌 Запишу в #todo list: “изучить как это работает внутри”

Получается мы можем использовать функцию как аргумент для другой функции - это функции первого класса (first-class functions), в современных языках вполне распространённая штука!

Понравилось как авторы Swift задизайнили неявное именование аргументов

let reverseTeam = team.sorted { $0 > $1 }

В Kotlin доступен только один неявный параметр, который называется it. Если понадобится использовать 2 и больше параметра - нужно будет явно написать названия этих параметров.

Эта тема очень важная, т.к. эти знания пригодятся почти в любом проекте 👩‍💻

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Всем привет, сегодня будет последний день, за который я планирую закончить оставшиеся из 14 уроков 💪

➡️Day 11: Access control, static properties and methods, and checkpoint 6

Модификаторы доступа всегда вызывают у меня смешанные чувства. Я отношусь к ним скептически. Пока у меня складывается ощущение, что мне не придётся писать сложную иерархию классов, а поэтому я буду ограничен только использованием этих модификаторов в библиотечных классах.

Статические поля и методы, они и в Африке статические

➡️Day 12: Classes, inheritance, and checkpoint 7

Изначально я ожидал, что это будет большая тема, но зная что такое struct понимание class существенно упрощается.
В целом классы в Swift очень похожи на классические классы ООП. Тут есть практически всё, что есть в struct, но в дополнение идёт наследование, отсутствие автоматических init методов для полей, и пожалуй самое интересное: объекты передаются по ссылке. Рассмотрим пример:


class User {
var username = “Ivan”
}

let user1 = User()
let user2 = user1

print(user1.username) // Ivan
print(user2.username) // Ivan

user2.username = “Petr”

print(user1.username) // Petr
print(user2.username) // Petr


Несмотря на то, что обе переменные объявлены с помощью let, поля могут быть изменены. Изменение user2.username меняет так же user1.username.
В случае использования struct User, нам нужно будет изменить var user2 = user1, чтобы была возможность изменить поле username. И что самое отличительное тут, это изменение user2.username не влечёт изменение user1.username. Насколько я понимаю, в какой-то момент создаётся копия экземпляра.

Также есть тонкости с тем, когда Swift удаляет ненужные объекты. Но это отдельный топик требующий внимания #todo

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Финишная прямая 🏁🏎

➡️Day 13: Protocols, extensions, and checkpoint 8

Протоколы это что-то вроде интерфейсов в Java/Kotlin. И struct и class могут реализовывать протоколы. В целом, можно использовать как я привык это делать, но до тех пор пока не потребуется что-то делать с типом Self и (или) associatedtype.

Насколько я понял, это тип будущей реализации протокола (как в случае с Self) или же какой-то тип, который будет определён в реализации протокола (как в случае с associatedtype). Выглядит как продвинутые фишки, но полезны они, скорее всего, авторам библиотек. #todo хочется изучить этот концепт более детально!

К слову, в Kotlin это достигается с помощью шаблонов (generics), но возможно есть ключевые отличия. И я жду, когда же в Swift я увижу generics? 🤔
var arr = [[String]]() не в счёт 🤣

Extensions
Так же присутствуют в Kotlin. Возможность добавить новый функционал для уже существующих protocol, struct, class.
Кстати, это и механизм для создания дефолтной реализации метода в протоколе. В Java/Kotlin это можно сделать напрямую в определении интерфейса.

Хоть меня сложно испугать типами, после того как я осилил Higher-Kinded Types в Scala 👩‍💻, Self, associatedtype, type erasure, some, any заставляют извилины пошевелиться вновь 🧠

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Проект 3

В этом проекте мы не создаём приложение, а разбираем ключевые концепции SwiftUI:
🟢 Особенности struct и почему они используются для View
🟢 Порядок применения свойств View
🟢 Почему body объявляется как some View
🟢 Модификаторы и условные модификаторы
🟢 View как переменные
🟢 Композиция View
🟢 Собственные модификаторы через View#modifier и лаконичный вариант с использованием extension
🟢 Создание своих @ViewBuilder

Больше всего меня впечатлили @ViewBuilder, и об этом я расскажу в отдельном посте. #todo

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Всем привет 👋

После дня отдыха (на самом деле ревью и рефлексии о том что сделано), я снова рвусь к знаниям 🏃‍♂️

Сегодняшний урок ничем особо не выдавался: работа с датами и селекторами для чисел.
НО! Мы неожиданно перешли к тренировке своей модельки ML… Поражает насколько просто это делается. И интересно, можно ли использовать модели сделанные на Python 👩‍💻 На первый взгляд этому ничего не мешает, если типы моделек совместимы #todo

Дальше будем ее использовать для предсказания… 🔮🧙‍♀️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Проект 7: Трекер расходов, разделенных на 2 типа: личные и бизнес

Day 36
🟢 @State и class по-умолчанию не работают вместе! @State перестаёт замечать изменения меняются свойства, а не объект целиком.
Попробовал тут разобраться с внутренностью, пока всё сложно, есть какой-то StateStorage, но в исходниках нет реализации… Это что-то абсолютно новое для меня. Очень хочу в этом разобраться #todo
🟢 Решить проблему выше помогает @Observable, но ставится он над определением класса, и называется Макрос. @State является Property Wrapper. В Kotlin и то, и другое называется Аннотация и обозначает одно и то же. В Swift по-другому.
🟢 sheet - окно, которое по своему функционалу больше похоже на модальное окно, но может содержать любой? контент. Опять же, непривычно, что показ окна основан на флаге, а не на событии/вызове функции
🟢 Codable - инструмент сериализации/десериализации, но в текущей задаче его применение очень ограничено, и я не смог оценить его хоть в какой-то мере

Day 37
В этом уроке мы применяли знания из предыдущего урока, чтобы наконец реализовать приложение

Дальше будет тест по материалу и челенж 🤘

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🆒1
Стало интересно что такое requestReview.
Это инстанс структуры RequestReviewAction определенной как:

// Available when SwiftUI is imported with StoreKit
@available(iOS 16.0, visionOS 1.0, macOS 13.0, *)
@available(tvOS, unavailable)
@available(watchOS, unavailable)
@MainActor public struct RequestReviewAction {

@MainActor public func callAsFunction()
}


Не помню чтобы про это рассказывалось, но callAsFunction в Swift позволяет делать вызов этой функции на объекте, не указывая название этой функции.

В Kotlin тоже есть такой функционал, выглядело бы это так:

class RequestReviewAction {
operator fun invoke() {
println("Requesting review...")
}
}

fun main() {
val requestReview = RequestReviewAction()
requestReview()
}


Что такое @MainActor ещё предстоит узнать #todo
👍2
Начинаем проект 18 (день 92)

Это технический проект, где мы начинаем изучать особенности layout системы SwiftUI.
На мой взгляд, самая сложная тема, которая требует большого количества экспериментов. Поскольку порой поведение вьюшек, скажем, удивляет.

🔴 Основное правило определение размеров состоит из 3 шагов:
1️⃣ Parent предлагает доступное пространство (propose size)
2️⃣ Child выбирает свой собственный размер (chooses its size)
3️⃣ Parent позиционирует child внутри себя

🔴 alignmentGuide модификатор и кастомный VerticalAlignment. Тут я совсем не понял как это работает и нужно с этим отдельно разобраться #todo

🔴offset & position
🔸offset - относительное смещение, интересно, что не влияет на последующие модификаторы (например, background color);
🔸position - абсолютное позиционирование на экране.

Читал в группах по разработке, что layouts это одна из самых важных тем. Посмотрим как пойдёт дальше. Возможно, понадобится посмотреть дополнительные ролики или почитать статьи 👀

Как вам новый стиль эмоджи? 🔥 правда?

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Всем привет! 👋 Пора бы заполнить тишину 😂

Сейчас я активно работаю над приложением 🇩🇪
Переделываю дизай - да, задумку про минимализм не получается реализовать на 💯 Хочется чего-то большего, и тут не получится без “Настроек” и прочих мелочей.

Обновляю не только визуал, хотя это большая часть. Но так же разобрался с локальными нотификациями - приложение само планирует когда и что показать. Либо само приложение, но чаще пользователь, настраивает расписание.
Есть ещё и серверные push-нотификации, когда с сервера присылаются уведомления. Это сложнее, и в моём случае пока не нужно было.

Помимо этого, поскольку я планирую использовать Firebase 🔥 и для других приложений, то этот проект выступает в роли подопытного кролика, на котором я реализую:

🔸 anonymous login - вполне говорящее название. Даже без регистрации (и смс) можно будет различать пользователей.

🔸 App Check - Firebase может проверять, что запросы приходят именного из твоего приложения. Работает через интеграцию с сервисами Apple. Когда сделаю - потестирую и отпишу о результатах #todo
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1