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

Дальше, скорее всего, будет много кода, и меня немного смущает, как Telegram отображает сниппеты. Например, нет нумерации строк, что не очень удобно.

Поэтому я думаю, как лучше оформить код в постах. Основное внимание будет на скриншотах приложений, но я также хочу делиться самим кодом.

Вот какие варианты я рассматриваю:
🟢Создавать проекты на GitHub 👩‍💻 - но чтение кода через GitHub может быть неудобным по сравнению с Telegram.
🟢Использовать GitHub Gist - это сниппеты кода в GitHub, но как это будет смотреться в Telegram, не уверен.
🟢Использовать страницы в Telegraph - они открываются прямо в Telegram, но пока не понятно, как будет выглядеть форматирование кода.
🟢Продолжить использовать стандартные Telegram-сниппеты - но мне не нравится, как это выглядит с большим количеством кода.
🟢Прикреплять код как изображения - возможно, так будет проще для восприятия, но зумить и искать по ним не получится

Если у кого-то есть идеи по этому вопросу - буду рад, если вы поделитесь! 😇
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1
Нууу.. начинаем 🔢 👶
Первым проектом будет приложения для разделения счёта в кафе/ресторане
Проект состоит из 3х частей, попробую осилить за один день
https://www.hackingwithswift.com/100/swiftui/16

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1👏1
За сегодняшний день я прошёл всё, что запланировал (нужны ли ссылки на уроки?)
🟢Day 16 – Project 1, part one
🟢Day 17 – Project 1, part two
🟢Day 18 – Project 1, part three
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В конечном итоге у меня получилось приложение такого вида
Это приложение по своей сути является калькулятором, позволяющим разделить определенную сумму и чаевые на указанное количество человек поровну
👍1
WeSplit.png
4 MB
Попробую скинуть код в таком формате. Telegram сохраняет качество, если отправлять как файл
👍1
И ещё продублирую кодом, а вы можете полайкать тот вариант, который больше нравится

import SwiftUI

struct ContentView: View {
@State private var totalAmount: Double = 0.0
@State private var numberOfPeople: Int = 2
@State private var tipPercentage: Int = 15
@FocusState private var isKeyboardFocused: Bool

private var amountPerPerson: Double {
return amountWithTips / Double(numberOfPeople)
}
private var amountWithTips: Double {
return totalAmount * (1 + Double(tipPercentage) / 100.0)
}

var body: some View {
NavigationView {
Form {
Section {
TextField("Amount", value: $totalAmount, format: .currency(code: "USD"))
.keyboardType(.decimalPad)
.focused($isKeyboardFocused)
Picker("Number of people", selection: $numberOfPeople) {
ForEach(2...20, id: \.self) {
Text("\($0) people")
}
}
}
Section("Tips") {
Picker("Tips size", selection: $tipPercentage) {
ForEach(0...100, id: \.self) {
Text($0, format: .percent)
}
}
.pickerStyle(.navigationLink)
}
Section("Amount per persion") {
Text(amountPerPerson, format: .currency(code: "USD"))
}
Section("Total") {
Text(amountWithTips, format: .currency(code: "USD"))
}
}
.navigationTitle("WeSplit")
.toolbar {
if isKeyboardFocused {
Button("Done") {
isKeyboardFocused = false
}
}
}
}
}
}
👍3
Что я узнал за эти уроки?
🟢NavigationView, Form, Section — базовые элементы для построения интерфейса.
🟢Safe Area — SwiftUI по умолчанию ограничивает рабочую область, чтобы интерфейс корректно отображался с вырезами на новых моделях iPhone (чёлка, строка статуса и т. д.).
🟢 Работа кнопок и изменение переменных через них.
🟢 @State - хитрая вещь, позволяет изменять переменные внутри struct
🟢 Привязка View и Model через $ перед именем переменной.
🟢 Ввод пользователя и работа с текстовыми полями.
🟢 Базовые принципы навигации в приложении.
🟢 Вычисляемые свойства.
🟢 @Focus управление видимостью элементов (например, клавиатуры).

Впечатления

Мне нравится подача материала: видео короткие, по делу, с полезными наблюдениями. Автор плавно усложняет темы, показывая новые концепции на основе уже изученных. Есть вещи, которые пока не до конца понятны, но это нормально — SwiftUI невозможно понять за пару уроков. Интересно разобраться, как он устроен под капотом (а может, и не стоит 🤔).

Отдельно отмечу внимание к деталям. Автор объясняет важность доступности (Accessibility), например, почему текстовые поля, даже если они не видны, нужны для экранных озвучивателей, помогающих слабовидящим пользователям.

So far, so good! А как вам
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Попробовал создать “пустое” приложение на Android, по типу “Hello World”. При первом запуске получил такое… Что называется встречают с караваем 🤣🤣
👍2😢1
Со второго раза запустилось 😎

В будущем хочу попробовать написать одно из учебных приложений (которые напишу под iOS) под Android без прохождения курса — просто опираясь на свой опыт и документацию. Интересно, насколько это получится и какие подводные камни встретятся по пути 🥸 Предвкушаю будет не просто

Напомню, что несмотря на то, что у меня много опыта с Kotlin, в Android я почти 0️⃣
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В конце первого проекта автор подготовил тест для самопроверки
Делюсь с вами моим весьма отличным результатом 💪
https://www.hackingwithswift.com/review/ios-swiftui/wesplit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Используя ChatGPT мне удалось реализовать такое вот приложение.
Оно позволяет сохранять фото, название, описание, оценку какого либо предмета или товара. Довольно таки простое по функционалу (мне даже удивительно, что ничего подобного не нашёл в AppStore 🅰️), но для меня оказалось очень полезным 😌 Поиск я так и не реализовал, но всё впереди

Дизайн приложения мне и самому не нравится 😅, а вот с технологической точки зрения, тут есть возможность добавлять категории, присутствует сортировка по рейтингу, используется Core Data для хранения сущностей
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Сегодняшний день - это упражнение на закрепление материала. Я выбрал реализацию конвертера времени
🔥2
Код 🔨

struct ContentView: View {
@State private var fromAmount: Double = 0.0
@FocusState private var keyboardFocused: Bool
let timeUnits = ["seconds", "minutes", "hours", "days"]
@State private var timeUnitFrom: String = "seconds"
@State private var timeUnitTo: String = "seconds"

private func timeUnitToSeconds(unit: String) -> Int {
switch unit {
case "seconds": return 1
case "minutes": return 60
case "hours": return 60 * 60
case "days": return 60 * 60 * 24
default:
return 0
}
}

private var resultTimeAmount: Double {
let fromSeconds = fromAmount * Double(timeUnitToSeconds(unit: timeUnitFrom))
return fromSeconds / Double(timeUnitToSeconds(unit: timeUnitTo))
}

var body: some View {
NavigationView {
Form {
Section("Convert from") {
TextField("Enter time", value: $fromAmount, format: .number)
.keyboardType(.decimalPad)
.focused($keyboardFocused)
Picker("Time Unit", selection: $timeUnitFrom) {
ForEach(timeUnits, id: \.self) {
Text($0)
}
}
.pickerStyle(.segmented)
}
Section("Converted") {
Text("\(resultTimeAmount)")
Picker("Time Unit", selection: $timeUnitTo) {
ForEach(timeUnits, id: \.self) {
Text($0)
}
}
.pickerStyle(.segmented)
}
}
.navigationTitle("Time Converter")
.toolbar {
if keyboardFocused {
Button("Done") {
keyboardFocused = false
}
}
}
}
}
}

Завтра постараюсь рассказать о своих впечатлениях от Xcode, если на это останется время, ведь я хочу осилить Проект 2 за один день
До встречи тут 👋
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Оказывается в swift можно присвоить результат switch переменной!

private func timeUnitToSeconds(unit: String) -> Int {
switch unit {
case "seconds": return 1
case "minutes": return 60
case "hours": return 60 * 60
case "days": return 60 * 60 * 24
default:
return 0
}
}

можно переписать как

private func timeUnitToSeconds(unit: String) -> Int {
return switch unit {
case "seconds": 1
case "minutes": 60
case "hours": 60 * 60
case "days": 60 * 60 * 24
default: 0
}
}


Но вроде как с if-else такое не сработает. Kotlin поддерживает оба варианта
👍2
Это выглядит мега странно!
👍2
У этого метода такая сигнатура:
nonisolated public func alert<A, M>(_ titleKey: LocalizedStringKey, isPresented: Binding<Bool>, @ViewBuilder actions: () -> A, @ViewBuilder message: () -> M) -> some View where A : View, M : View
Почему actions можно писать без имени, а message указывать обязательно?
Я бы еще понял alert(...) {} {} или alert(…) actions: {} message: {}, но alert(…) {} message: {} 🤔
Хотя самый понятный вариант:
alert(…, actions: {}, message: {})
👍2
Это называется trailing closure syntax, у hackingwithswift рассказывалось про это, но насколько помню, не было примеров, когда были ещё аргументы после invoke(a: “”, b: “”) { } someAction : { }
К слову в Kotlin 👩‍💻 есть похожий синтаксис, но там только последний параметр-функцию можно записать как someFunction(arg1, arg2) { }
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2