Проект 13 (Day 64)
Следующий урок закончил! 2 за 1 день - достойно похвалы, пойду съем по этому случаю яблоко👩💻
Сегодня в программе:
🟢 Выбор изображения из библиотеки фото. Делается это с помощью
🟢
🟢
Следующий урок закончил! 2 за 1 день - достойно похвалы, пойду съем по этому случаю яблоко
Сегодня в программе:
PhotosPicker
. Однозначно мне пригодится!ShareLink
- конфигурируемый элемент, чтобы вызвать диалоговое окно share. Думаю все и так знают что это такое.@Environment(\.requestReview) var requestReview
- попросить пользователя оставить отзыв. Вызывается как функция requestReview()
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Стало интересно что такое
Это инстанс структуры
Не помню чтобы про это рассказывалось, но callAsFunction в Swift позволяет делать вызов этой функции на объекте, не указывая название этой функции.
В Kotlin тоже есть такой функционал, выглядело бы это так:
Что такое
requestReview
.Это инстанс структуры
RequestReviewAction
определенной как:
// Available when SwiftUI is imported with StoreKit
@available(iOS 16.0, visionOS 1.0, macOS 13.0, *)
@available(tvOS, unavailable)
@available(watchOS, unavailable)
@MainActor public struct RequestReviewAction {
@MainActor public func callAsFunction()
}
Не помню чтобы про это рассказывалось, но callAsFunction в Swift позволяет делать вызов этой функции на объекте, не указывая название этой функции.
В Kotlin тоже есть такой функционал, выглядело бы это так:
class RequestReviewAction {
operator fun invoke() {
println("Requesting review...")
}
}
fun main() {
val requestReview = RequestReviewAction()
requestReview()
}
Что такое
@MainActor
ещё предстоит узнать #todo👍2
Какой подход вам ближе?
Final Results
67%
callAsFunction 👩💻
33%
invoke 👩💻
0%
Оба отлично смотрятся 💪
Kotlin/Swift (iOS) Туда и Обратно
Какой подход вам ближе?
После жарких дебатов наш консилиум решил оставить 👩💻 отправлена в архив, страница с жалобами - удалена.
callAsFunction
. Петиция в Apple Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Проект 13 (Day 65) - объединение изученного!
Сегодня добавили основные UI элементы приложения, а так же реализовали изменение интенсивности фильтра.
Дальше добавим возможность менять фильтры.
Использование и конвертация [CI, CG, UI, ]Image, как неоднократно подмечалось автором, выглядит монструозно🤯
Сегодня добавили основные UI элементы приложения, а так же реализовали изменение интенсивности фильтра.
Дальше добавим возможность менять фильтры.
Использование и конвертация [CI, CG, UI, ]Image, как неоднократно подмечалось автором, выглядит монструозно
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Какой формат интереснее?
Anonymous Poll
75%
0%
50%
50%
50%
Решать задачи на leetcode 👩💻 используя Swift сложнее потому, что ошибки просто нечитаемые. Конкретно эта ошибка - доступ по индексу больше чем размер массива.
Если смотреть как оптимист, то это то, что нужно, ведь приходится в голове продебажить код и найти ошибку😃
В Xcode такое встретить тоже можно 🫠
Если смотреть как оптимист, то это то, что нужно, ведь приходится в голове продебажить код и найти ошибку
В Xcode такое встретить тоже можно 🫠
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Закончил Проект 13 🥳
Последним штрихом была поддержка других фильтров, и выбор активного среди них. А так же реализация share функционала.
Работа с изображениями мне нравится, и теперь это в моём ящике с инструментами! Держись фотошоп, я иду📱
Последним штрихом была поддержка других фильтров, и выбор активного среди них. А так же реализация share функционала.
Работа с изображениями мне нравится, и теперь это в моём ящике с инструментами! Держись фотошоп, я иду
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
День 68 и это новый Проект 14. Сегодня начинаем разработку приложения-трекера мест, которые хотим посетить.
Сначала, как обычно, подготовительные уроки. Вот ключевые темы, которые пригодятся при реализации:
🟢
🟢
Можно представить его как кладовку: складывать туда удобно, но лучше не забывать наводить порядок, иначе потом найдётся куча старых ненужных файлов, как в ящике с носками.🧦
🟢 Выбор View через значение enum. Не лучший вариант с точки зрения полиморфизма, но зато просто и наглядно:
#hackingwithswift
Сначала, как обычно, подготовительные уроки. Вот ключевые темы, которые пригодятся при реализации:
Comparable
- протокол, позволяющий использовать операторы <, <=, >= и >. Полезен, если нужно сравнивать объекты собственного типа. Документация.URL.documentsDirectory
- тут приложение может сохранить свои файлы. Должно синхронизоваться с iCloud.Можно представить его как кладовку: складывать туда удобно, но лучше не забывать наводить порядок, иначе потом найдётся куча старых ненужных файлов, как в ящике с носками.
var body: some View {
switch loadingState {
case .loading:
LoadingView()
case .success:
SuccessView()
case .failed:
FailedView()
}
}
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Сколько iOS разработчиков среди нас? 🤔
Anonymous Poll
36%
iOS 👩💻
0%
Android 👩💻
36%
Другое 👩💻
27%
Не разраб (пока) 🧑🎓
Проект 14 (День 69)
1️⃣ Добрались до карт 🗺 используем MapKit.
Я приятно удивлён с какой лёгкостью они интегрируются в приложение:
Похоже, что мы ограничены только своей фантазией. С ними можно делать что угодно. Размещать SwiftUI компоненты поверх, пожалуй, самое простое из этого.
2️⃣ Touch ID & Face ID 🔒
Всё что нужно - это вежливо попросить. Остальное iOS сделает за нас.
Кстати, почему есть отдельный тип для Pointer? Я ожидал увидеть👩💻
#hackingwithswift
Я приятно удивлён с какой лёгкостью они интегрируются в приложение:
Map {
ForEach(locations) { location in
Marker(location.name, coordinate: location.coordinate)
}
}
.mapStyle(.hybrid)
Похоже, что мы ограничены только своей фантазией. С ними можно делать что угодно. Размещать SwiftUI компоненты поверх, пожалуй, самое простое из этого.
Всё что нужно - это вежливо попросить. Остальное iOS сделает за нас.
func authenticate() {
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
error: &error
) {
let reason = "Любимые места - это маленький секрет"
context.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
localizedReason: reason
) { success, authenticationError in
if success {
isUnlocked = true
}
}
}
}
Кстати, почему есть отдельный тип для Pointer? Я ожидал увидеть
*
, как в
@available(iOS 8.0, *)
open func canEvaluatePolicy(_ policy: LAPolicy, error: NSErrorPointer) -> Bool
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Только сейчас заметил, что порядок параметров строго зафиксирован 😕
Если есть такая структура:
То такой код не работает:
После работы с Kotlin, свободный порядок именованных параметров кажется интуитивно очевидным, но это не так.
Если есть такая структура:
struct Location: Codable, Equatable, Identifiable {
let id: UUID
var name: String
var description: String
var latitude: Double
var longitude: Double
}
То такой код не работает:
Location(id: UUID(), description: "", latitude: 0, longitude: 0, name: "name")
name
должен стоять ровно между id
& description
После работы с Kotlin, свободный порядок именованных параметров кажется интуитивно очевидным, но это не так.
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Сегодня продуктивный день! Проект 14 (День 70)
Даже не знаю про что тут рассказать. В основном использовали изученое ранее, просто собрали всё вместе.
Единственное, что в таком виде у меня не заработало, даже на физическом устройстве.
Определяем выбранную метку на карте с помощью долгого нажатия, для открытия окна редактирования:
Переделал так, заработало:
Не знаю точно, но возможно карта перехватывает жест в первом случае.
Это можно как-то затрейсить логами или отдебажить?
#hackingwithswift
Даже не знаю про что тут рассказать. В основном использовали изученое ранее, просто собрали всё вместе.
Единственное, что в таком виде у меня не заработало, даже на физическом устройстве.
Определяем выбранную метку на карте с помощью долгого нажатия, для открытия окна редактирования:
Image()
.onLongPressGesture {
selectedPlace = location
}
Переделал так, заработало:
Image()
.simultaneousGesture(LongPressGesture(minimumDuration: 1).onEnded { _ in selectedPlace = location })
Не знаю точно, но возможно карта перехватывает жест в первом случае.
Это можно как-то затрейсить логами или отдебажить?
#hackingwithswift
Ах да, была такая штука -
Чтобы вернуть из EditView новый объект, доступный в callback onSave, сделали конструктор:
Использовали
Насколько понял, этот механизм переносит замыкание из стека в heap. При этом важно не ссылаться на
@escaping
Чтобы вернуть из EditView новый объект, доступный в callback onSave, сделали конструктор:
init(location: Location, onSave: @escaping (Location) -> Void) {
self.location = location
self.onSave = onSave
_name = State(initialValue: location.name)
_description = State(initialValue: location.description)
}
Использовали
@escaping
, чтобы сказать компилятору - “будем вызывать это замыкание потом, не в этом методе”.Насколько понял, этот механизм переносит замыкание из стека в heap. При этом важно не ссылаться на
self
.🤔1
Kotlin/Swift (iOS) Туда и Обратно pinned «Сколько iOS разработчиков среди нас? 🤔»
Media is too big
VIEW IN TELEGRAM
Проект 14 (Дни 72 и 73) - финальный аккорд.
Не так уж много осталось:
🟢 Запросы к Wikipedia API, чтобы получить список мест рядом. И я проявил супер креативность 😊 - имя метки берёт title первого результата.
🟢 Сортировка списка мест, полученных из Wikipedia.
🟢 MVVM - слышал и читал про этот подход, когда делал десктопное приложение на Java. SwiftUI справляется гораздо лучше, т.к. он по-умолчанию “реактивный”.
Пока до тестов не добрался - всей прелести не увидел, но могу уже представить.
🟢 Face ID - его мы просто реализовали так же как и ранее (в подготовительном уроке). Тема раскрыта в одном из предыдущих постов.
#hackingwithswift
Не так уж много осталось:
Пока до тестов не добрался - всей прелести не увидел, но могу уже представить.
#hackingwithswift
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3