Финишная прямая 🏁🏎
➡️ Day 13: Protocols, extensions, and checkpoint 8
Протоколы это что-то вроде интерфейсов в Java/Kotlin. И
Насколько я понял, это тип будущей реализации протокола (как в случае с Self) или же какой-то тип, который будет определён в реализации протокола (как в случае с associatedtype). Выглядит как продвинутые фишки, но полезны они, скорее всего, авторам библиотек. #todo хочется изучить этот концепт более детально!
К слову, в Kotlin это достигается с помощью шаблонов (generics), но возможно есть ключевые отличия. И я жду, когда же в Swift я увижу🤔
🤣
Extensions
Так же присутствуют в Kotlin. Возможность добавить новый функционал для уже существующих
Кстати, это и механизм для создания дефолтной реализации метода в протоколе. В Java/Kotlin это можно сделать напрямую в определении интерфейса.
Хоть меня сложно испугать типами, после того как я осилил Higher-Kinded Types в Scala👩💻 , Self, associatedtype, type erasure, some, any заставляют извилины пошевелиться вновь 🧠
#hackingwithswift
Протоколы это что-то вроде интерфейсов в Java/Kotlin. И
struct
и class
могут реализовывать протоколы. В целом, можно использовать как я привык это делать, но до тех пор пока не потребуется что-то делать с типом Self
и (или) associatedtype
.Насколько я понял, это тип будущей реализации протокола (как в случае с Self) или же какой-то тип, который будет определён в реализации протокола (как в случае с associatedtype). Выглядит как продвинутые фишки, но полезны они, скорее всего, авторам библиотек. #todo хочется изучить этот концепт более детально!
К слову, в Kotlin это достигается с помощью шаблонов (generics), но возможно есть ключевые отличия. И я жду, когда же в Swift я увижу
generics
? var arr = [[String]]()
не в счёт Extensions
Так же присутствуют в Kotlin. Возможность добавить новый функционал для уже существующих
protocol
, struct
, class
.Кстати, это и механизм для создания дефолтной реализации метода в протоколе. В Java/Kotlin это можно сделать напрямую в определении интерфейса.
Хоть меня сложно испугать типами, после того как я осилил Higher-Kinded Types в Scala
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Концепция опциональных (nullable) типов давно не нова, изначально это были различные обёртки (очень современно в Java, они там есть до сих пор, называется Optional), потом, если не ошибаюсь,
C#
ввели синтаксис вида Type?
.На мой взгляд это лаконично и элегантно - отличное решение авторов Swift & Kotlin переиспользовать это
Я нашёл любопытной подход
guard
, когда мы делаем проверку входящих параметров:
func printSquare(of number: Int?) {
guard let number = number else {
print("Missing input")
// 1: We *must* exit the function here
return
}
// 2: `number` is still available outside of `guard`
print("\(number) x \(number) is \(number * number)")
}
Возможно это ничем не лучше
if let unwrappedNumber = number {
printSquare(of: unwrappedNumber)
}
Но позволяет перенести “распаковку” опционального типа внутрь функции. Особенно если эта функция вызывается часто.
Наедюсь во время создания приложения встретить случай когда эта конструкция окажется полезной.
Оператор объединения с nil
Данная конструкция присутствует и в Kotlin, но там она выглядит интереснее - Элвис оператор
?:
Наклоните голову налево и поймете почему он так называется
optional try
Классно! Просто классно!
do {
let result = try runRiskyFunction()
print(result)
} catch {
// it failed!
}
можно переписать как
if let result = try? runRiskyFunction() {
print(result)
}
но так в случае если ошибка совсем не важна.
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Вот и всё! Основы Swift в кармане, и я готов погружаться в SwiftUI 👶
Дальше, скорее всего, будет много кода, и меня немного смущает, как Telegram отображает сниппеты. Например, нет нумерации строк, что не очень удобно.
Поэтому я думаю, как лучше оформить код в постах. Основное внимание будет на скриншотах приложений, но я также хочу делиться самим кодом.
Вот какие варианты я рассматриваю:
🟢 Создавать проекты на GitHub 👩💻 - но чтение кода через GitHub может быть неудобным по сравнению с Telegram.
🟢 Использовать GitHub Gist - это сниппеты кода в GitHub, но как это будет смотреться в Telegram, не уверен.
🟢 Использовать страницы в Telegraph - они открываются прямо в Telegram, но пока не понятно, как будет выглядеть форматирование кода.
🟢 Продолжить использовать стандартные Telegram-сниппеты - но мне не нравится, как это выглядит с большим количеством кода.
🟢 Прикреплять код как изображения - возможно, так будет проще для восприятия, но зумить и искать по ним не получится
Если у кого-то есть идеи по этому вопросу - буду рад, если вы поделитесь!😇
Дальше, скорее всего, будет много кода, и меня немного смущает, как Telegram отображает сниппеты. Например, нет нумерации строк, что не очень удобно.
Поэтому я думаю, как лучше оформить код в постах. Основное внимание будет на скриншотах приложений, но я также хочу делиться самим кодом.
Вот какие варианты я рассматриваю:
Если у кого-то есть идеи по этому вопросу - буду рад, если вы поделитесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1
Какой формат подходит больше всего?
Anonymous Poll
80%
Не хочу переходить на внешние ресурсы (как GitHub)
20%
Готов читать листинги на внешних ресурсах
0%
Вообще не хочу их читать, дай мне скриншот
Нууу.. начинаем 🔢 👶
Первым проектом будет приложения для разделения счёта в кафе/ресторане
Проект состоит из 3х частей, попробую осилить за один день
https://www.hackingwithswift.com/100/swiftui/16
#hackingwithswift
Первым проектом будет приложения для разделения счёта в кафе/ресторане
Проект состоит из 3х частей, попробую осилить за один день
https://www.hackingwithswift.com/100/swiftui/16
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1👏1
За сегодняшний день я прошёл всё, что запланировал (нужны ли ссылки на уроки?)
🟢 Day 16 – Project 1, part one
🟢 Day 17 – Project 1, part two
🟢 Day 18 – Project 1, part three
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
WeSplit.png
4 MB
Попробую скинуть код в таком формате. Telegram сохраняет качество, если отправлять как файл
👍1
И ещё продублирую кодом, а вы можете полайкать тот вариант, который больше нравится
import SwiftUI
struct ContentView: View {
@State private var totalAmount: Double = 0.0
@State private var numberOfPeople: Int = 2
@State private var tipPercentage: Int = 15
@FocusState private var isKeyboardFocused: Bool
private var amountPerPerson: Double {
return amountWithTips / Double(numberOfPeople)
}
private var amountWithTips: Double {
return totalAmount * (1 + Double(tipPercentage) / 100.0)
}
var body: some View {
NavigationView {
Form {
Section {
TextField("Amount", value: $totalAmount, format: .currency(code: "USD"))
.keyboardType(.decimalPad)
.focused($isKeyboardFocused)
Picker("Number of people", selection: $numberOfPeople) {
ForEach(2...20, id: \.self) {
Text("\($0) people")
}
}
}
Section("Tips") {
Picker("Tips size", selection: $tipPercentage) {
ForEach(0...100, id: \.self) {
Text($0, format: .percent)
}
}
.pickerStyle(.navigationLink)
}
Section("Amount per persion") {
Text(amountPerPerson, format: .currency(code: "USD"))
}
Section("Total") {
Text(amountWithTips, format: .currency(code: "USD"))
}
}
.navigationTitle("WeSplit")
.toolbar {
if isKeyboardFocused {
Button("Done") {
isKeyboardFocused = false
}
}
}
}
}
}
👍3
Что я узнал за эти уроки?
🟢 NavigationView, Form, Section — базовые элементы для построения интерфейса.
🟢 Safe Area — SwiftUI по умолчанию ограничивает рабочую область, чтобы интерфейс корректно отображался с вырезами на новых моделях iPhone (чёлка, строка статуса и т. д.).
🟢 Работа кнопок и изменение переменных через них.
🟢
🟢 Привязка View и Model через $ перед именем переменной.
🟢 Ввод пользователя и работа с текстовыми полями.
🟢 Базовые принципы навигации в приложении.
🟢 Вычисляемые свойства.
🟢
Впечатления
Мне нравится подача материала: видео короткие, по делу, с полезными наблюдениями. Автор плавно усложняет темы, показывая новые концепции на основе уже изученных. Есть вещи, которые пока не до конца понятны, но это нормально — SwiftUI невозможно понять за пару уроков. Интересно разобраться, как он устроен под капотом (а может, и не стоит 🤔).
Отдельно отмечу внимание к деталям. Автор объясняет важность доступности (Accessibility), например, почему текстовые поля, даже если они не видны, нужны для экранных озвучивателей, помогающих слабовидящим пользователям.
So far, so good! А как вам❓
@State
- хитрая вещь, позволяет изменять переменные внутри struct @Focus
управление видимостью элементов (например, клавиатуры).Впечатления
Мне нравится подача материала: видео короткие, по делу, с полезными наблюдениями. Автор плавно усложняет темы, показывая новые концепции на основе уже изученных. Есть вещи, которые пока не до конца понятны, но это нормально — SwiftUI невозможно понять за пару уроков. Интересно разобраться, как он устроен под капотом (а может, и не стоит 🤔).
Отдельно отмечу внимание к деталям. Автор объясняет важность доступности (Accessibility), например, почему текстовые поля, даже если они не видны, нужны для экранных озвучивателей, помогающих слабовидящим пользователям.
So far, so good! А как вам
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Со второго раза запустилось 😎
В будущем хочу попробовать написать одно из учебных приложений (которые напишу под iOS) под Android без прохождения курса — просто опираясь на свой опыт и документацию. Интересно, насколько это получится и какие подводные камни встретятся по пути🥸 Предвкушаю будет не просто
Напомню, что несмотря на то, что у меня много опыта с Kotlin, в Android я почти0️⃣
В будущем хочу попробовать написать одно из учебных приложений (которые напишу под iOS) под Android без прохождения курса — просто опираясь на свой опыт и документацию. Интересно, насколько это получится и какие подводные камни встретятся по пути
Напомню, что несмотря на то, что у меня много опыта с Kotlin, в Android я почти
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В конце первого проекта автор подготовил тест для самопроверки
Делюсь с вами моим весьма отличным результатом💪
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