Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
130 photos
21 videos
9 files
88 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
В конечном итоге у меня получилось приложение такого вида
Это приложение по своей сути является калькулятором, позволяющим разделить определенную сумму и чаевые на указанное количество человек поровну
👍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
Проект 2:
Предлагается реализация игры, в которой пользователю нужно выбирать правильный флаг страны.
Самостоятельно в рамках челенджа предлагалось реализовать обработку конца игры

Что узнал:
🟢SwiftUI базируется на состоянии, а не на событиях. Например для показа alert используется флаг (показывать или нет) вместо привычного в ООП alert.show()
🟢С помощью обычных градиентов можно получить неплохой дизайн
🟢Как работают шрифты
🟢В Xcode есть специальный тул, позволяющий протестировать шрифты динамически
🟢Подгрузка картинок из Assets

Всё сделал, всё получилось! И выглядит замечательно 😊

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👏1
И вновь прилежный ученик, но не все вопросы такие уж простые
🔥4
Проект 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