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

Это тест на понимание материала по Проекту 3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Сегодня - день 25, а это значит, что четверть пути позади 🎆🎆🎆 Ура товарищи!

Задание было довольно интересным: нужно было сгенерировать условия для игрока.

1️⃣ Выбрать случайную фигуру.
2️⃣ Определить, кто должен быть в паре — победитель или проигравший.
3️⃣ Предложить игроку выбрать правильную фигуру.

Например:
Генерируется Бумага, а задача - найти фигуру, которая ей проигрывает.
Правильный ответ - Камень 🤘
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
PaperScissorsRock.png
4.3 MB
Определение пары далеко не оптимально, каюсь, но фокус сейчас другой 😋
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Всем привет 👋

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

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

Дальше будем ее использовать для предсказания… 🔮🧙‍♀️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Сегодня я вновь попробовал решить ежедневную задачу на leetcode 👩‍💻 используя Swift 👩‍💻
Почему у строки нельзя взять символ по индексу? 🤔

class Solution {
func areAlmostEqual(_ s1: String, _ s2: String) -> Bool {
var diffIndices = [Int]()
let s1AsArr = Array(s1)
let s2AsArr = Array(s2)
for i in 0..<s1.count where s1AsArr[i] != s2AsArr[i] {
diffIndices.append(i)
}

if diffIndices.count == 0 {
return true
}
if diffIndices.count > 2 || diffIndices.count == 1 {
return false
}
return s1AsArr[diffIndices[0]] == s2AsArr[diffIndices[1]] && s1AsArr[diffIndices[1]] == s2AsArr[diffIndices[0]]
}
}

А вот for i in range where condition выглядит классно 💪

Канонично ли так использовать Swift?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Прошёл замечательный урок, демонстрирующий мощный инструмент ML.
Первая ошибка в тесте 😅

Попробуйте ответить: всегда ли в сутках 86400 секунд, и если нет, то когда это не так?

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1🤔1