Kotlin/Swift (iOS) Туда и Обратно
36 subscribers
130 photos
21 videos
9 files
88 links
Канал - журнал, рассказывающий об опыте изучения Swift & iOS backend-разработчиком на Java & Kotlin
Download Telegram
Сегодняшний день - это упражнение на закрепление материала. Я выбрал реализацию конвертера времени
🔥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
Ещё была такая вещь:
"^[\(coffeeAmount) cup](inflect: true)" превращающая cup в cups если coffeeAmount > 1
Почему-то у меня сработало только для английских слов 🤔

Был удивлён, что работает это на основе Markdown
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1👀1
Проект 5

Игра Word Scramble, где пользователю предлагается составить слова из случайно выбранного слова. Например: для слова человек подходят варианты, чело, век, вол, волк и так далее

Темы
🟢 List как элемент SwiftUI, позволяющий отображать список View
🟢 onAppear - действие, которое выполняется при показе View. Пока не знаю как оно реагирует на изменение View.
🟢 fatalError - возможность закрашить приложение при неразрешимой ситуации
🟢 UITextChecker - проверка слова на корректность в смысле правописания.
Применяется оно так:

func isReal(word: String) -> Bool {
let checker = UITextChecker()
let range = NSRange(location: 0, length: word.utf16.count)
let misspelledRange = checker.rangeOfMisspelledWord(in: word, range: range, startingAt: 0, wrap: false, language: "en")

return misspelledRange.location == NSNotFound
}

Выглядит, конечно, так себе. Но подозреваю я ещё увижу немало подобного кода, из-за поддержки Objective-C
🟢 Подгрузка файлов из Bundle
🟢 Бонусом было добавление элемента в список (List) используя анимацию

#hackingwithswift обещает, что это был послендний “простой” проект, но меня после ML будет сложно удивить 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
И снова я отличник 5️⃣
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2