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

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

Сегодняшний урок ничем особо не выдавался: работа с датами и селекторами для чисел.
НО! Мы неожиданно перешли к тренировке своей модельки 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
Оказывается, что в alert необязательно добавлять кнопку Ok, SwiftUI 👶 добавит её за нас. Пишем просто пустые {}

.alert(errorTitle, isPresented: $showingError) { } message: {
Text(errorMessage)
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Выходные не проходят зря и сегодня я знакомлюсь с анимацией 👋


struct ContentView: View {
@State private var animationAmount = 1.0

var body: some View {
Button("Tap Me") {
}
.padding(50)
.foregroundStyle(.white)
.background(Color.blue)
.clipShape(.circle)
.overlay {
Circle()
.stroke(.black)
.scaleEffect(animationAmount)
.opacity(2 - animationAmount)
.animation(.easeInOut(duration: 1).repeatForever(autoreverses: false), value: animationAmount)

}
.onAppear {
animationAmount = 2
}
}
}


Удивляет с какой простотой достигаются красивые эффекты. Напоиманает чем-то css 👩‍💻
Кто у кого списывал? 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
А вот анимирование биндингов (bindings) взрывает мой проц 🤯

Stepper("Scale amount", value: $animationAmount.animation(
.easeInOut(duration: 1)
.repeatCount(3, autoreverses: true)
), in: 1...10)

Как утверждает автор, такую анимацию можно сделать и для Boolean значений.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Давайте посмотрим как оно работает с Boolean

struct ContentView: View {
@State private var isOn = false

var body: some View {
VStack {
Toggle(isOn: $isOn.animation(.easeInOut(duration: 0.5))) {
Label {
Text("Show Button")
} icon: {}
}
.padding()
Button("Circle Button") {
}
.padding(50)
.foregroundStyle(.white)
.background(Color.blue)
.clipShape(.circle)
.opacity(isOn ? 1 : 0)
}
}
}
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🤩🤩🤩
Кто-нибудь расскажите мне как это работает… как кнопка рисуется анимировано?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Я думаю достаточно на сегодня постов. Мне нужна передышка 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Извините, но похоже еще один пост сегодня будет ☺️
Я не мог не закончить Проект 6 сегодня
Челлендж состоит в том, что нужно прикрутить анимацию к сделанному ранее приложению Guess Flag
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Всем привет 👋

Сегодня нужно было самостоятельно сделать тренажёр для таблицы умножения.
Выбираете лимит для множителей и количество вопросов, затем предоставляется 3 варианта, где только 1 верный

В UI/UX я пока совсем мало что понимаю, и то, что хочется сделать - не получается
Задумка была похожая, но намного красивее.
Чувствую ограничение в доступных мне инструментах, и трудности настройки стилей 😕
👍1🤔1
Я не мог нормально спать после такого разочарования, зато теперь я больше знаю про позиционирование View!

К тому же, освоил создание переиспользуемых View, где параметры передаются через @Binding, что позволяет динамически изменять переданные значения.

А еще я научился настраивать цвета в Assets 💪

🔥 новый дизайн значительно лучше
👍 до этого тоже было нормально
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Бегло прочитал эту книгу т.к. большая часть тем мне известна, но что-то удалось оттуда подчерпнуть.
Основная претензия к оформлению листингов, тут это просто текст. Воспринимать их сложнее.
В целом книга больше похожа на справочник, а не учебное пособие, несмотря на наличие комментариев от автора. Заданий я тоже не нашел.

Есть и вторая книга, но она не входит в подписку, а покупать желания нет 😁, тем более она про UIKit, до которого я еще не дорос.

Буду продолжать курс hackingwithswift
👍2👀1
Проект 7: Трекер расходов, разделенных на 2 типа: личные и бизнес

Day 36
🟢 @State и class по-умолчанию не работают вместе! @State перестаёт замечать изменения меняются свойства, а не объект целиком.
Попробовал тут разобраться с внутренностью, пока всё сложно, есть какой-то StateStorage, но в исходниках нет реализации… Это что-то абсолютно новое для меня. Очень хочу в этом разобраться #todo
🟢 Решить проблему выше помогает @Observable, но ставится он над определением класса, и называется Макрос. @State является Property Wrapper. В Kotlin и то, и другое называется Аннотация и обозначает одно и то же. В Swift по-другому.
🟢 sheet - окно, которое по своему функционалу больше похоже на модальное окно, но может содержать любой? контент. Опять же, непривычно, что показ окна основан на флаге, а не на событии/вызове функции
🟢 Codable - инструмент сериализации/десериализации, но в текущей задаче его применение очень ограничено, и я не смог оценить его хоть в какой-то мере

Day 37
В этом уроке мы применяли знания из предыдущего урока, чтобы наконец реализовать приложение

Дальше будет тест по материалу и челенж 🤘

#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🆒1
И да, мне интересно получить обратную связь, ведь мы вместе уже больше трети 100 Days марафона! Дайте обратную связь 🙏
Anonymous Poll
78%
Всё круто, продолжай 💪
0%
Бросай это дело 🤮
22%
Нормально… 🫠
Результат челенжа!

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

В этом приложении пришлось разделить список трат на 2, т.к. удаление работает через IndexSet, который, как я понимаю, соответсвует индексам из ForEach. Они в свою очередь должны соответствовать индексам массива из которого мы удаляем элементы. Таким образом общий список обрабатывать сложнее, проще разделить!

Начинаем следить за тратами?
Please open Telegram to view this post
VIEW IN TELEGRAM