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