TGViewer
Channel Public Channel
easy_dev991

easy_dev991

@easy_dev991

Делюсь интересными находками/лайфхаками в процессе разработки под iOS/Android, и возможно ты найдешь что-то полезное для себя!

GitHub: https://github.com/easydev991
Subscribers
617
Photos
74
Videos
23
Links
208

Showing posts older than #231 · Back to latest

Older Posts 19 shown
Post #230 467
easy_dev991 struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let description: String? } /// Выполнить…
#swift #foundation #keypath #hint

Представляю вам KeyPathComparator, доступный с iOS 15.
Решает задачу из опроса на изи)


struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let description: String?
}

/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name)) // <- вот
}

/// Выполнить работу с массивом и вернуть отсортированный массив
/// - Parameters:
/// - items: Изначальный массив
/// - order: Порядок сортировки
/// - Returns: Отсортированный массив
func doSortedWork(with items: [ComplexModel], order: SortOrder) -> [ComplexModel] {
// другая логика ...
return items.sorted(using: KeyPathComparator(\.name, order: order))
}
Apple Developer Documentation KeyPathComparator | Apple Developer Documentation A comparator that uses another sort comparator to provide the comparison of values at a key path.
  • 👍 4
  • 🔥 2
Post #229 386
easy_dev991 struct ComplexModel { let name: String let id: Int let price: Double let isActive: Bool let creationDate: Date let websiteURL: URL? let tags: [String] let statistics: [String: Int] let description: String? } /// Выполнить…
  • ❤ 1
  • 👍 1
Post #228 374
struct ComplexModel {
let name: String
let id: Int
let price: Double
let isActive: Bool
let creationDate: Date
let websiteURL: URL?
let tags: [String]
let statistics: [String: Int]
let description: String?
}

/// Выполнить работу с массивом и вернуть отсортированный массив
func doWork(with items: [ComplexModel]) -> [ComplexModel] {
// другая логика ...
return items.sorted(by: { $0.name < $1.name })
}
  • 🫡 2
Post #227 397
easy_dev991 Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
#finder #macos #hint

Как изменить габариты сразу нескольких картинок (ширину/высоту) на MacOS:
1. Выделяем нужные картинки
2. Открываем с помощью "Просмотр"
3. Выделяем все (command + A)
4. Инструменты -> Настроить размер
  • 👍 5
  • 🔥 2
  • 😁 1
Post #225 407
easy_dev991 Нужно переименовать сразу несколько файлов, а еще - изменить габариты сразу нескольких картинок (ширину/высоту). Сможешь сделать это без единой строчки кода на маке (и без терминала)?
#finder #macos #hint

Как переименовать сразу несколько файлов в finder на MacOS:
1. Выделяем нужные файлы
2. Правый клик -> Переименовать...
3. Настраиваем параметры
  • 😁 8
  • 👍 4
  • 🔥 2
  • 👌 2
Post #224 407
  • ❤ 1
Post #222 639
#news #wwdc25

Обычно я не публикую новости с WWDC, но перед этим не устоял.

Обещают, что загрузка проектов будет до 40% быстрее в новой версии Xcode 😱

Конечно, можно придраться к слову "до", но все же.
И еще, Xcode будет весить на 24% меньше, и это тоже хорошо)

Видос с обзором всех новых штук тут.
  • 🔥 6
Post #221 493
#terminal #bundler #rbenv #hint

Кто читал предыдущую статью про использование Makefile, и при этом впервые применил эти команды, скорее всего после перезапуска терминала столкнулся с ошибкой типа такой:

Could not find ‘bundler’ (2.6.5) required by your Gemfile.lock. (Gem::GemNotFoundException)


И после перезапуска терминала не работают команды bundle*, например: 

bundle exec fastlane


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

Вот что нужно сделать, чтобы эти настройки не сбрасывались.

1. Выполните в терминале по очереди эти две команды:

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc


2. Затем примените изменения командой:

source ~/.zshrc


3. Всё! Теперь rbenv всегда будет работать автоматически, когда вы открываете терминал в папке проекта с файлом .ruby-version.

Это безопасно:
- rbenv специально разработан так, чтобы работать для каждого проекта отдельно, если в проекте есть файл .ruby-version
- Добавление строк в ~/.zshrc просто включает автоматическое переключение версий Ruby для каждого проекта, но не фиксирует какую-то одну версию Ruby глобально
- Все ваши проекты будут использовать именно ту версию Ruby, которая указана в их собственном .ruby-version.

Если захотите убрать эти настройки, просто откройте файл ~/.zshrc (например, командой nano ~/.zshrc или через Finder) и удалите строки:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"


После этого сохраните файл и выполните:

source ~/.zshrc


Всё вернётся как было 👌
  • 👌 2
  • ❤ 1
Post #213 611
#xcode #bug

В Xcode 16.3 для дебага приходилось нажимать esc при вводе названий свойств в консоли, чтобы увидеть подсказки.

Недавно вышла релизная версия Xcode 16.4, в которой этот баг поправили.
Ура! 🎉
  • 🔥 3
  • ❤ 1
Post #210 571
#ios #swift #swiftui #binding #bug

Как сломать Xcode 16.3, чтобы в логах не было нормального описания ошибки:

import SwiftUI

struct BreakSwiftExample: View {
@State private var isOn = false
private var isOnBinding: Binding<Bool> {
.init(
get: { isOn },
set: changeToggle // не собирается
// set: { isOn = $0 } // собирается
)
}

var body: some View {
Toggle("Демо-тоггл", isOn: isOnBinding)
}

private func changeToggle(_ value: Bool) {
isOn = value
}
}


Результат: Command SwiftCompile failed with a nonzero exit code
  • ❤ 2
  • 👍 2
  • 🔥 1
Post #209 546
#terminal #git #hint

Бывает, что после выполнения задачи ветку удаляют в репозитории, а локально она все еще висит. И когда таких веток набирается много, можно в них запутаться 😅

Чтобы удалить разом все такие ветки, нужно перейти в терминале в папку с проектом и выполнить команду:

git branch | grep -v "^\*" | while read branch; do
if ! git show-ref --verify --quiet refs/remotes/origin/$branch; then
git branch -D $branch
fi
done


Объяснение:
• git branch выводит список всех локальных веток.
• grep -v "^\*" исключает текущую активную ветку (чтобы не удалять её).
• Для каждой ветки проверяется, существует ли она на сервере (refs/remotes/origin/branch).
• Если ветка отсутствует на сервере, она удаляется принудительно (git branch -D), что удалит ветку даже если в ней есть несмерженные изменения.

Перед выполнением команды нужно убедиться, что вы переключились на ветку, которую не хотите удалять (например, main или master).
  • 👌 5
  • ❤ 1
Post #208 529
#ios #appstoreconnect

Обычно после статуса "Одобрено" идет "Готово к распространению".

Ошибка аппстора или им так понравилась сборка, что одобрили дважды? 😅
  • 😁 2
  • 👍 1
Post #206 572
  • 👍 4
  • 🔥 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →