В конце первого проекта автор подготовил тест для самопроверки
Делюсь с вами моим весьма отличным результатом💪
https://www.hackingwithswift.com/review/ios-swiftui/wesplit
Делюсь с вами моим весьма отличным результатом
https://www.hackingwithswift.com/review/ios-swiftui/wesplit
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Используя ChatGPT мне удалось реализовать такое вот приложение.
Оно позволяет сохранять фото, название, описание, оценку какого либо предмета или товара. Довольно таки простое по функционалу (мне даже удивительно, что ничего подобного не нашёл в AppStore🅰️ ), но для меня оказалось очень полезным 😌 Поиск я так и не реализовал, но всё впереди
Дизайн приложения мне и самому не нравится😅 , а вот с технологической точки зрения, тут есть возможность добавлять категории, присутствует сортировка по рейтингу, используется Core Data для хранения сущностей
Оно позволяет сохранять фото, название, описание, оценку какого либо предмета или товара. Довольно таки простое по функционалу (мне даже удивительно, что ничего подобного не нашёл в AppStore
Дизайн приложения мне и самому не нравится
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Код 🔨
Завтра постараюсь рассказать о своих впечатлениях от Xcode, если на это останется время, ведь я хочу осилить Проект 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
У этого метода такая сигнатура:
Почему
Я бы еще понял
Хотя самый понятный вариант:
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 рассказывалось про это, но насколько помню, не было примеров, когда были ещё аргументы после
К слову в Kotlin👩💻 есть похожий синтаксис, но там только последний параметр-функцию можно записать как
invoke(a: “”, b: “”) { } someAction : { }
К слову в Kotlin
someFunction(arg1, arg2) { }
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проект 2:
Предлагается реализация игры, в которой пользователю нужно выбирать правильный флаг страны.
Самостоятельно в рамках челенджа предлагалось реализовать обработку конца игры
Что узнал:
🟢 SwiftUI базируется на состоянии, а не на событиях. Например для показа alert используется флаг (показывать или нет) вместо привычного в ООП
🟢 С помощью обычных градиентов можно получить неплохой дизайн
🟢 Как работают шрифты
🟢 В Xcode есть специальный тул, позволяющий протестировать шрифты динамически
🟢 Подгрузка картинок из
Всё сделал, всё получилось! И выглядит замечательно😊
#hackingwithswift
Предлагается реализация игры, в которой пользователю нужно выбирать правильный флаг страны.
Самостоятельно в рамках челенджа предлагалось реализовать обработку конца игры
Что узнал:
alert.show()
Assets
Всё сделал, всё получилось! И выглядит замечательно
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👏1
Проект 3
В этом проекте мы не создаём приложение, а разбираем ключевые концепции SwiftUI:
🟢 Особенности struct и почему они используются для View
🟢 Порядок применения свойств View
🟢 Почему
🟢 Модификаторы и условные модификаторы
🟢 View как переменные
🟢 Композиция View
🟢 Собственные модификаторы через
🟢 Создание своих
Больше всего меня впечатлили
#hackingwithswift
В этом проекте мы не создаём приложение, а разбираем ключевые концепции SwiftUI:
body
объявляется как some View
View#modifier
и лаконичный вариант с использованием extension
@ViewBuilder
Больше всего меня впечатлили
@ViewBuilder
, и об этом я расскажу в отдельном посте. #todo#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
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
Дальше будем ее использовать для предсказания… 🔮🧙♀️
После дня отдыха (на самом деле ревью и рефлексии о том что сделано), я снова рвусь к знаниям
Сегодняшний урок ничем особо не выдавался: работа с датами и селекторами для чисел.
НО! Мы неожиданно перешли к тренировке своей модельки ML… Поражает насколько просто это делается. И интересно, можно ли использовать модели сделанные на Python
Дальше будем ее использовать для предсказания… 🔮
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👀1
Сегодня я вновь попробовал решить ежедневную задачу на leetcode 👩💻 используя Swift 👩💻
Почему у строки нельзя взять символ по индексу?🤔
А вот
Канонично ли так использовать 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