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

Какое-то время назад я обнаружил, что хотел бы приложение на iPhone, которого не смог найти в AppStore 📱. Тогда у меня появилась идея написать приложение самостоятельно, ну а как иначе 😅, заодно освоив новые технологии и платформу.
Какое-то время назад (лет 5), я пробовал себя в написании простых приложений под Android 👩‍💻 (на тот момент меня не впечатлило). Сейчас я хочу попробовать 👩‍💻, а потом дать шанс Android ещё раз.

Этот канал будет своего рода дневником. Посмотрим что из этого выйдет 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Почему я завёл этот канал? 🤔

Вот несколько причин, которые вдохновили меня:

🟢Делиться знаниями
Я верю, что мой опыт и наработки могут быть полезны не только мне, но и другим. Возможно, кто-то найдет здесь ответы на свои вопросы или дополнительную мотивацию для изучения программирования.

🟢Поддерживать мотивацию
Когда ты делишься своим прогрессом, появляется желание не стоять на месте. Каждый новый пост — это шаг вперёд, который подталкивает меня к новым знаниям и достижениям.

🟢Упорядочивать знания
Когда я объясняю что-то другим, я лучше понимаю это сам. Канал — отличный способ структурировать информацию и глубже разобраться в сложных темах.

🟢Архивировать свой путь
Этот канал для меня ещё и дневник, куда я могу заглянуть спустя время, чтобы увидеть, какой путь я прошёл и чему научился.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
План изучения Swift & iOS 👶

Приложение, которое я хотел бы создать требует некоторые из основных возможностей iOS. Несмотря на то, что я являюсь опытным разработчиком на Java/Kotlin, мои знания в Swift & iOS близки к 0.

Поэтому я недолго думая обратился за помощью ко всем нам известному приятелю ChatGPT. Попросил его создать мне план, специально под нужное мне приложение.

Вот что из этого получилось:
🟢Основы Swift (2-3 недели)
🟢Основы iOS (2-3 недели)
🟢Основы SwiftUI (2-3 недели) - да, я хочу попробовать начать именно с него
🟢Работа с базами данных (3 недели)
🟢Работа с камерой и библиотекой фото (2 недели)
🟢Геопозиция и карты (2 недели)
🟢Поиск по приложению (2 недели)
🟢Распознавание текста на фото (1-2 недели)
🟢Облачный бэкап и Google Drive (2-3 недели)
🟢Подготовка и запуск приложения (2 недели) - этим я никогда не занимался, но это пожалуй самое главное из всего!

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

Ну что ж, пожелайте мне удачи 🍀
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21
Материал для обучения

Я посмотрел несколько списков обучающих материалов. На данный момент остановился на
↪️ Курс Stanford: CS193p - Developing Apps for iOS - https://cs193p.sites.stanford.edu/2023
↪️ Hacking With Swift - https://www.hackingwithswift.com/100/swiftui

Первым хочу попробовать Hacking With Swift. По ощущениям я могу пройти его быстрее чем 100 дней, т.к. у меня уже есть опыт программирования.
По мере его прохождения, буду рассказывать впечатление от курса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔1
Что случилось перед тем как я отправился в этот путь

Когда мне захотелось написать своё приложение, мои знания 🛠 были равны нулю. С помощью ChatGPT я начал работу над реализацией своей идеи, и результат оказался для меня весьма положительным.

Используя SwiftUI, мне удалось довольно быстро создать рабочий прототип, который я уже начал использовать. Да, функционал ограничен, но главное — он решает поставленную задачу.

Написание приложения с помощью ChatGPT действительно возможно, но есть серьёзные нюансы. Хотя ChatGPT хорошо объясняет предлагаемые решения, понимание остаётся поверхностным. Многие аспекты остаются туманными и требуют дополнительного изучения.

Немного о моём опыте со Swift

Swift — красивый язык, но есть моменты, которые, на мой взгляд, лучше реализованы в Java или Kotlin. Например, ссылки на методы.


let abc = Abc()
let sing = abc.pronounce
sing()


На первый взгляд может показаться, что это опечатка, и в оригинале должно быть: let sing = abc.pronounce().

Для сравнения, в Kotlin этот код выглядел бы так:

val abc = Abc()
val sing = abc::sing
sing()


Скобки можно забыть, а :: явно указывает на ссылку. Конечно, это не критично и, возможно, дело привычки, но мне кажется, что подход Kotlin выглядит более очевидным.

KeyPath: уникально, но непривычно

Другой момент касается KeyPath:

let person = Person(name: “Олежа”, age: 30)
let nameKeyPath = \Person.name
let name = person[keyPath: nameKeyPath]

Когда я впервые увидел \, мне это напомнило символ экранирования. Подобное ощущение возникло и с интерполяцией строк:

print("City: \(city)")


Хотя это специфично для Swift, первое впечатление было неоднозначным.

Поскольку эта история, которая заняла у меня около 5–8 вечеров за два месяца, оставила у меня только положительные эмоции, я задумался о том, чтобы подойти к разработке серьёзнее.
Теперь я пишу этот блог ✏️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Привет, привет, привет! 🖖

В итоге я решил остановиться на курсе Hacking with Swift: 100 Days of SwiftUI.

Мне очень понравилось вводное видео, несмотря на его продолжительность (около часа).
Автор рассказывает:
🟢 почему стоит использовать SwiftUI и UIKit;
🟢 какие базовые навыки необходимы;
🟢 основные ошибки, которые люди совершают при обучении (не только SwiftUI, но и в целом);
🟢 полезные материалы для изучения;
🟢 и многое другое.

В видео особенно понравилось, как автор объясняет причины выбора технологий и делится практическими советами по обучению.

Я ожидаю, что данный курс мне удастся пройти намного быстрее чем 100 дней.
Проверим вместе? 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Начало положено! 🔥

Вчерашний день стал отличным стартом моего пути в изучении Swift 👉

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

➡️ Day 1: Variables, constants, strings, and numbers
➡️ Day 2: Booleans, string interpolation, and checkpoint 1
➡️ Day 3: Arrays, dictionaries, sets, and enums

Общее впечатление от уроков 5️⃣
Курс отлично оформлен, материал подаётся доступно, с чёткими примерами, что особенно важно для новичков.

💡 Что понравилось:
🟢Чёткая структура: каждый урок сопровождается текстом, дублирующим содержание видео. Это здорово экономит время, когда нужно быстро освежить материал.
🟢Наглядность: примеры простые, но при этом хорошо раскрывают суть тем.

⚠️ Что можно улучшить:
Тесты, которые добавил автор, они помогают проверить усвоение урока, но есть большое НО, тесты мне показались не очень полезными, тк они одинаковые. Да-да, 6 задач в тесте, и все они как близнецы. Возможно в дальнейших уроках тесты будут более полезными.

🛠 Для меня из этих 3 уроков, самым полезным была демонстрация синтаксиса определения массива (array) и словарь (dictionary), а так же возможность компилятора понимать тип и опускать название класса как в этом примере

enum Weekday {
case monday, tuesday, wednesday, thursday, friday
}

var day = Weekday.monday
day = .tuesday
day = .friday


Надеюсь, следующие уроки не разочаруют! 🤞🍀
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1🙏1
Я занимаюсь решением задач на Leetcode 👩‍💻 уже два года. За это время я освоил основные подходы к решению таких задач.

В какой-то момент мне казалось, что они имеют мало общего с теми, которые я решаю на работе. Однако это впечатление оказалось ошибочным 🛑

Через несколько месяцев я заметил, что решения, которые я нахожу для повседневных задач, начинают автоматически оптимизироваться — изменился сам подход к решению.
При этом важно понимать, что оптимизация не всегда имеет решающее значение, но если несколько решений одинаковы по трудозатратам, почему бы не выбрать наиболее эффективное?
Если архитектура решения продумана, а все его части оптимизированы, то на выходе получится (если не вдаваться в детали) почти оптимальный продукт.

Сегодня я впервые решил задачу на Leetcode 👩‍💻 с использованием Swift 🗺. В ближайшее время напишу пост об этом… ✍️
#leetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Сегодняшняя задача: https://leetcode.com/problems/map-of-highest-peak/
1765. Map of Highest Peak - нужно построить сушу с самыми высокими холмами, где высота в каждой клетке отличается от соседних не более чем на 1. Изначально клетка = 1 обозначает воду, а клетка = 0 сушу. При ответе высота воды обозначается 0.

Решение:

class Solution {
func highestPeak(_ isWater: [[Int]]) -> [[Int]] {
let m = isWater.count
let n = isWater.first!.count
var mutableIsWater = isWater
var queue = Deque<(Int, Int)>()

for i in 0..<m {
for j in 0..<n {
if isWater[i][j] == 1 {
queue.append((i, j))
isWaterMutable[i][j] = 0
} else {
isWaterMutable[i][j] = -1
}
}
}

let directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
var currentHeight = 1
while !queue.isEmpty {
let layerSize = queue.count
for _ in 0..<layerSize {
let (i, j) = queue.popFirst()!
directions.forEach { direction in
let x = i + direction.0
let y = j + direction.1
if x >= 0 && x < m && y >= 0 && y < n {
if isWaterMutable[x][y] == -1 {
isWaterMutable[x][y] = currentHeight
queue.append((x, y))
}
}
}
}
currentHeight += 1
}

return isWaterMutable
}
}


Я использую BFS (поиск в ширину), который реализуется с помощью структуры данных Queue. При реализации я активно пользовался Google, т.к. для меня оказалось трудностью элементарное использование for цикла. Но это оказалось вполне посильным.

Некоторые интересные моменты, которые я подметил для себя:

🟢 tuple: выражение вида (i, j) и let x = i + direction.0. Это простой способ работы с парами значений, который позволяет делать код более читаемым и удобным.
🟢 if: В отличие от Kotlin, в Swift скобки не обязательны для одиночных операторов внутри if. В Kotlin я привык писать if (condition) { ... }, но в Swift можно написать if condition и это будет работать.
🟢 range: В Swift для работы с диапазонами используется синтаксис 0..<n или 0...n-1, в то время как в Kotlin аналогичный диапазон записывается как 0 until n или 0..n-1.
🟢 let: В Swift let защищает коллекции от модификации, что оказалось довольно удобным и безопасным. Это добавляет уверенности, что коллекции не будут случайно изменены. Любопытно как это реализовано 🤔

Маленькая задача, а сколько открытий! Предвкушаю, что меня ждёт дальше в изучении Swift 🥸
#leetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1👀1
Мой прогресс в изучении Swift 🔢

Я продвигаюсь быстрее, чем успеваю делиться здесь своими успехами. Исправляю это недоразумение… но поэтапно, чтобы всё было удобно воспринимать:

➡️ Day 4: Type annotations and checkpoint 2

Этот урок не открыл для меня ничего принципиально нового — большинство концепций уже знакомо мне из Kotlin.

💡 Однако узнал пару интересных моментов:
🟢Array в Swift — это аналог List в Kotlin.
🟢У Array нет встроенного метода для удаления дубликатов. Для этого нужно преобразовать его в Set (который автоматически удаляет дубликаты) и при необходимости снова в Array.

➡️ Day 5: If, switch, and the ternary operator

В этом уроке мне не понравилась структура подачи материала: автор начинает с демонстрации различных видов сравнений, а только потом объясняет, что всё это базируется на boolean, и общий вид конструкции следующий:

if (boolean) {
// some code
} else {
// some code
}

На мой взгляд, понять логику проще, если сначала объяснить общий вид, а потом привести пару примеров.

💡 Интересное из урока:
🟢В switch есть возможность “проваливаться” в следующий case без проверки его условия, используя ключевое слово fallthrough. Однако пока я не совсем понял, в каких случаях это реально полезно. 🙊 Если у кого-то есть идеи или примеры, буду рад услышать!

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👏1🤔1
Едем дальше 🚗:

➡️ Day 6: Loops, summary, and checkpoint 3

Циклы это один из основных строительных блоков. Swift блестяще справляется с реализацией этой абстракции.
Единственное отличие, которое я нашёл, это отсутствие labels (метки) как outer@ в следующем примере


outer@ for (i in 1..3) {
for (j in 1..3) {
if (j == 2) break@outer
println("i: $i, j: $j")
}
}

Но этот функционал я нахожу немного спорным, как и break & continue, т.к. это усложняет читабельность кода.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👨‍💻1
➡️Day 7: Functions, parameters, and return values

Интересный топик, т.к. тут я нашёл для себя отличный функционал, а именно алиасы (ака внешнее имя) для параметров. Выглядит это так:

func printTimesTables(for number: Int) {
for i in 1...12 {
print("\(i) x \(number) is \(i * number)")
}
}

printTimesTables(for: 5)

💡 Что это даёт?
Внутри функции мы обращаемся к параметру как number, а при вызове - используем более понятное имя for. Это значительно улучшает читаемость и восприятие кода.

Кстати, Swift позволяет использовать даже зарезервированные слова вроде for в качестве алиасов, что тоже приятно удивляет.

А вот работа с Tuple оказалась приятной неожиданностью.

func printTupleValues(tuple: (a: Int, b: Int, c: Int)) {
print(tuple.a)
print(tuple.b)
print(tuple.c)
}

printTupleValues(tuple: (1, 2, 3))
printTupleValues(tuple: (a: 2, b: 3, c: 1))


В Kotlin отсутствует встроенная структура данных, аналогичная кортежам в Swift. Вместо этого там есть Pair (для двух элементов) и Triple (для трёх элементов). Если требуется больше элементов, обычно используются data class или списки.

Однако возможность именовать параметры внутри кортежей в Swift выглядит как интересное и удобное решение. Пока что я не уверен, насколько это полезно на практике, но выглядит элегантно.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
В ближайшие дни я планирую закончить с первыми 14 уроками, которые посвящены основам Swift как языка. Эти уроки дают базу, необходимую для понимания ключевых концепций, таких как работа с типами, функциями и структурами данных. Всё это несомненно пригодится в дальнейшем.

Что дальше?
После этого нас ждет работа с серией занятий про SwiftUI - жду с нетерпением! 🥺
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🎉1
➡️Day 8: Default values, throwing functions, and checkpoint 4

Дефолтные значения параметров не стали для меня откровением, так как они присутствуют и в Kotlin, поэтому тут всё ожидаемо.
А вот конструкция для перехвата исключений выглядит немного странно

do {
try throwingFunction1()
nonThrowingFunction1()
try throwingFunction2()
nonThrowingFunction2()
try throwingFunction3()
} catch {
// handle errors
}

Думаю, когда я буду писать подобные конструкции, понимание такого решения будет более понятным.
Пока мне всё же привычно как это выглядит в Kotlin:

try {
// Code that may throw an exception
} catch (e: SomeException) {
// Code for handling the exception
}

В остальном тема исключений довольно таки общая для многих языков программирования.

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Большая тема впереди

➡️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
Под недавними постами вы можете оставить комментарий ✏️
Буду рад вашему фидбэку!

Также поддержите меня реакциями — это даст дополнительную мотивацию делиться своим прогрессом в деталях 🙏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👀1