🔥✍️ Если вы пробовали писать виджеты, то знаете, насколько это больно и неприятно.
Но с появлением Compose, начали создавать интересный фреймоврк — Jetpack Glance, который позволяет создавать виджеты, используя Compose: а это значит, что стало меньше ограничений, больше возможностей для дебага, да и вообще создавать их приятнее.
Зависимости:
Чтобы добавить зависимость от Glance, пропишите репозиторий Google Maven в проект.
А для необходимых артефактов добавьте следующие зависимости в build.gradle:
dependencies {
// Для поддержки Glance
implementation("androidx.glance:glance:1.0.0-rc01")
// Для поддержки AppWidgets
implementation("androidx.glance:glance-appwidget:1.0.0-rc01")
// Для поддержки Wear-Tiles
implementation("androidx.glance:glance-wear-tiles:1.0.0-alpha05")
}
android {
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.1.0-beta03"
}
kotlinOptions {
jvmTarget = "1.8"
}
}
Эта штука пока находится в стадии релиз-кандидата (до этого 5 альф и 1 бета), поэтому есть крупный шанс, что оно таки увидит свет, а значит, нужно готовиться 💪🧑💻
#софт
Но с появлением Compose, начали создавать интересный фреймоврк — Jetpack Glance, который позволяет создавать виджеты, используя Compose: а это значит, что стало меньше ограничений, больше возможностей для дебага, да и вообще создавать их приятнее.
Зависимости:
Чтобы добавить зависимость от Glance, пропишите репозиторий Google Maven в проект.
А для необходимых артефактов добавьте следующие зависимости в build.gradle:
dependencies {
// Для поддержки Glance
implementation("androidx.glance:glance:1.0.0-rc01")
// Для поддержки AppWidgets
implementation("androidx.glance:glance-appwidget:1.0.0-rc01")
// Для поддержки Wear-Tiles
implementation("androidx.glance:glance-wear-tiles:1.0.0-alpha05")
}
android {
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.1.0-beta03"
}
kotlinOptions {
jvmTarget = "1.8"
}
}
Эта штука пока находится в стадии релиз-кандидата (до этого 5 альф и 1 бета), поэтому есть крупный шанс, что оно таки увидит свет, а значит, нужно готовиться 💪🧑💻
#софт
❤6👏4🥰1
Пишете под iOS или Android? Тогда скорее подавайте заявку на участие в мероприятии, которое пройдет 16–17 сентября.
Приглашаются разработчики на Swift под iOS и на Kotlin или Java под Android с опытом от трех лет.
Как проходит Mobile Weekend Offer:
➖ Вступительная часть: 30 минут. Расскажут о проектах и процессе интервью
➖ Кодинг и общение с экспертами: 120 минут. Попросят решить несколько задач, спросят про ваш подход к работе
➖ Знакомство с командами: 60 минут. Познакомят вас с будущими коллегами из разных проектов
➖ Оффер. Если все прошло хорошо, сделают оффер в течение трех дней
#мероприятие
Приглашаются разработчики на Swift под iOS и на Kotlin или Java под Android с опытом от трех лет.
Как проходит Mobile Weekend Offer:
➖ Вступительная часть: 30 минут. Расскажут о проектах и процессе интервью
➖ Кодинг и общение с экспертами: 120 минут. Попросят решить несколько задач, спросят про ваш подход к работе
➖ Знакомство с командами: 60 минут. Познакомят вас с будущими коллегами из разных проектов
➖ Оффер. Если все прошло хорошо, сделают оффер в течение трех дней
#мероприятие
Т‑Банк
Работа в ИТ
Вакансии для разработчиков, аналитиков, продактов, дизайнеров и других специалистов
❤7🥱7🤔2
😎 Очередной #дайджест по Kotlin, Swift и кроссплатформе
✍️ Простая анимация для всплывающего окна — реализация простой анимации для UIView из ViewController и кнопки
✍️ Изучаем новый Preview Macro на Swift UI и UIKit — работа с изображением с помощью PreviewProvider, UIViewController и кнопки с переходом
✍️ Кодогенерация. KAPT. KSP. Manual DI — для избавления от рефлексии, которая сильно тормозит скорость работы приложения в рантайме
✍️ Пошаговое руководство по тестированию скриншотов в Android — как реализовать тестирование скриншотов с помощью библиотеки Shot и отслеживать регрессию
✍️ Распознаем паспорт РФ в PWA — все работает через несколько скриптов: работа с камерой, передача потока изображений, сервис воркера и определение WASM сборки
✍️ Чего стоит ожидать в React Native — анализ развития опираясь на фреймворк Expo, работы группы Software Mansion, Callstack и Meta
✍️ Простая анимация для всплывающего окна — реализация простой анимации для UIView из ViewController и кнопки
✍️ Изучаем новый Preview Macro на Swift UI и UIKit — работа с изображением с помощью PreviewProvider, UIViewController и кнопки с переходом
✍️ Кодогенерация. KAPT. KSP. Manual DI — для избавления от рефлексии, которая сильно тормозит скорость работы приложения в рантайме
✍️ Пошаговое руководство по тестированию скриншотов в Android — как реализовать тестирование скриншотов с помощью библиотеки Shot и отслеживать регрессию
✍️ Распознаем паспорт РФ в PWA — все работает через несколько скриптов: работа с камерой, передача потока изображений, сервис воркера и определение WASM сборки
✍️ Чего стоит ожидать в React Native — анализ развития опираясь на фреймворк Expo, работы группы Software Mansion, Callstack и Meta
👍21🔥4❤2👏1
Еще лет 10 назад, только работники финансовой отрасли, помощники руководителей и менеджеры могли жаловаться на деградацию своих навыков и потерю знаний.
Учителя отмечают положительное влияние нынешней работы на профессиональное развитие. Рост и развитие в профессии отмечает большинство дизайнеров и медсестер. Программисты чаще системных администраторов отмечают, что развиваются в профессиональном плане на своей работе.
В целом по рынку труда 46% трудоустроенных россиян отмечают, что их работа позволяет развиваться в профессии, 35% не замечают роста и развития, но и не теряют навыки, 12% заявили о негативном влиянии работы на профессиональное развитие.
Учителя отмечают положительное влияние нынешней работы на профессиональное развитие. Рост и развитие в профессии отмечает большинство дизайнеров и медсестер. Программисты чаще системных администраторов отмечают, что развиваются в профессиональном плане на своей работе.
В целом по рынку труда 46% трудоустроенных россиян отмечают, что их работа позволяет развиваться в профессии, 35% не замечают роста и развития, но и не теряют навыки, 12% заявили о негативном влиянии работы на профессиональное развитие.
❤6👍2👏1
Как вы считаете, какое влияние оказывает на ваше профессиональное развитие ваша нынешняя работа?
Anonymous Poll
52%
Положительное - я профессионально развиваюсь и расту
13%
Негативное - я теряю проф.навыки
31%
Никакое - я не развиваюсь, но и ничего не теряю
4%
Свой вариант
❤2👍2
❗«Библиотека программиста» продолжает поиски контент-менеджера для ведения телеграм-каналов
Ищем человека, который грамотно пишет, разбирается в контенте и в одной из этих тем:
👉С++
👉Frontend
👉мобильная разработка
👉тестирование
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Подробнее о вакансии и форма для отклика — по ссылке.
Ждем вас в команде!
Ищем человека, который грамотно пишет, разбирается в контенте и в одной из этих тем:
👉С++
👉Frontend
👉мобильная разработка
👉тестирование
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Подробнее о вакансии и форма для отклика — по ссылке.
Ждем вас в команде!
❤4
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
Почему Swift может заменить Python в мл?
Статья про перспективы языка Swift, поддержку от некоторых популярных фреймворков (TensorFlow) и плюсы языка относительно Python.
Основные тезисы:
🔸 Поддержка от передовых фреймворков из мл
🔸 Математические функции
🔸 Скорость
🔸 Импортируемость Python в Swift
🔸 Возможность писать как высокоуровневый, так и низкоуровневый код
Статье уже почти 4 года, но существенные обновления для Swift происходят только последнее время, так что будет интересно как уже в ближайшие пол года изменится индустрия и какую роль в этом сыграет Swift.
Ссылка на статью
Статья про перспективы языка Swift, поддержку от некоторых популярных фреймворков (TensorFlow) и плюсы языка относительно Python.
Основные тезисы:
🔸 Поддержка от передовых фреймворков из мл
🔸 Математические функции
🔸 Скорость
🔸 Импортируемость Python в Swift
🔸 Возможность писать как высокоуровневый, так и низкоуровневый код
Статье уже почти 4 года, но существенные обновления для Swift происходят только последнее время, так что будет интересно как уже в ближайшие пол года изменится индустрия и какую роль в этом сыграет Swift.
Ссылка на статью
❤8👍2🔥2🥱2
В iOS 17 появилось несколько очень интересных улучшений, которые значительно упростят работу с картами в SwiftUI и MapKit. На примере небольшого компонента карты с возможностью поиска, попробуем разобраться, что тут к чему.
Создание map view
Делается это с помощью создания нового Swift UIView с Mapkit Map view внутри и автоматическим масштабированием и панорамой:
import SwiftUI
import MapKit
struct SearchableMap: View {
@State private var position = MapCameraPosition.automatic
var body: some View {
Map(position: $position)
.ignoresSafeArea()
}
}
Теперь необходимо добавить sheet overlay на custom view, которое позволит выполнять поиск местоположений (вставляем после .ignoresSafeArea):
.sheet(isPresented: $isSheetPresented) {
SheetView()
}
Вот так должен выглядеть SheetView.swift на данный момент:
import SwiftUI
import MapKit
struct SheetView: View {
@State private var search: String = ""
var body: some View {
VStack {
// 1
HStack {
Image(systemName: "magnifyingglass")
TextField("Search for a restaurant", text: $search)
.autocorrectionDisabled()
}
.modifier(TextFieldGrayBackgroundColor())
Spacer()
}
.padding()
// 2
.interactiveDismissDisabled()
// 3
.presentationDetents([.height(200), .large])
// 4
.presentationBackground(.regularMaterial)
// 5
.presentationBackgroundInteraction(.enabled(upThrough: .large))
}
}
struct TextFieldGrayBackgroundColor: ViewModifier {
func body(content: Content) -> some View {
content
.padding(12)
.background(.gray.opacity(0.1))
.cornerRadius(8)
.foregroundColor(.primary)
}
}
Читать статью
#туториал
Создание map view
Делается это с помощью создания нового Swift UIView с Mapkit Map view внутри и автоматическим масштабированием и панорамой:
import SwiftUI
import MapKit
struct SearchableMap: View {
@State private var position = MapCameraPosition.automatic
var body: some View {
Map(position: $position)
.ignoresSafeArea()
}
}
Теперь необходимо добавить sheet overlay на custom view, которое позволит выполнять поиск местоположений (вставляем после .ignoresSafeArea):
.sheet(isPresented: $isSheetPresented) {
SheetView()
}
Вот так должен выглядеть SheetView.swift на данный момент:
import SwiftUI
import MapKit
struct SheetView: View {
@State private var search: String = ""
var body: some View {
VStack {
// 1
HStack {
Image(systemName: "magnifyingglass")
TextField("Search for a restaurant", text: $search)
.autocorrectionDisabled()
}
.modifier(TextFieldGrayBackgroundColor())
Spacer()
}
.padding()
// 2
.interactiveDismissDisabled()
// 3
.presentationDetents([.height(200), .large])
// 4
.presentationBackground(.regularMaterial)
// 5
.presentationBackgroundInteraction(.enabled(upThrough: .large))
}
}
struct TextFieldGrayBackgroundColor: ViewModifier {
func body(content: Content) -> some View {
content
.padding(12)
.background(.gray.opacity(0.1))
.cornerRadius(8)
.foregroundColor(.primary)
}
}
Читать статью
#туториал
👍27👏2❤1
🤨💥 Еще один подход к дебагу приложений на iOS. LLD-команды могут значительно помочь в отладке приложений для iOS, особенно когда вы сталкиваетесь со сложными проблемами, которые стандартные средства отладки могут не полностью устранить.
🔹 frame variable -T
Use Case: когда у вас есть переменная с неясным типом и необходимо быстро определить ее тип данных.
Пример: если у вас есть переменная с именем response и вы хотите узнать ее тип, используйте переменную frame -T response.
🔹 settings set target.language swift
Use Case: когда вы отлаживаете смешанный проект Swift и Objective-C и хотите обеспечить правильную оценку выражений.
Пример: settings set target.language swift.
🔹 expr -l Swift — myArray.map { $0 + 1 }
Use Case: для вычисления выражения Swift без изменения кода.
Пример: если у вас есть массив myArray, вы можете использовать expr -l Swift -- myArray.map { $0 + 1 }, чтобы добавить 1 к каждому элементу.
🔹 image list -o -f
Use Case: для просмотра списка загруженных модулей с путями к их файлам для устранения неполадок.
Пример: использование image list -o -f, для просмотра всех загруженных модулей и путей к ним.
🔹 register read
Use Case: когда нужно проверить значения регистров процессора, чтобы понять состояние софта.
Пример: использование register read для проверки значений регистра во время сбоя или неожиданного поведения.
🔹 memory write -s 4–0x12345678 0xdeadbeef
Use Case: для изменения определенного адреса памяти во время отладки.
Пример: использование memory write -s 4 -- 0x12345678 0xdeadbeef, чтобы изменить данные по адресу 0x12345678 на 0xdeadbeef.
🔹 watchpoint modify -c ‘(old_val != new_val)’ variable
Use Case: когда необходимо отслеживать изменения значения переменной с определенным условием.
Пример: изменение watchpoint в myVariable, чтобы она запускалась при изменении ее значения, используя watchpoint modify -c '(old_val != new_val)' myVariable.
🔹 disassemble -c 10 — name functionName
Use Case: для проверки ассемблерного кода конкретной функции, чтобы понять ее поведение.
Пример: разбор первых 10 инструкций функции с именем myFunction с помощью disassemble -c 10 --name myFunction.
🔹 breakpoint command add — one-shot true 1.1
Use Case: когда необходимо выполнить определенную команду один раз при достижении точки останова.
Пример: добавление команды в точку останова 1.1, которая выводит сообщение с помощью breakpoint command add --one-shot true 1.1.
🔹 type lookup -r ‘^Swift.Array’
Use Case: необходимо найти все типы Swift, соответствующие определенному шаблону.
Пример: найти все типы, начинающиеся со Swift.Array, используя поиск по типу -r ^Swift.Array.
#туториал
🔹 frame variable -T
Use Case: когда у вас есть переменная с неясным типом и необходимо быстро определить ее тип данных.
Пример: если у вас есть переменная с именем response и вы хотите узнать ее тип, используйте переменную frame -T response.
🔹 settings set target.language swift
Use Case: когда вы отлаживаете смешанный проект Swift и Objective-C и хотите обеспечить правильную оценку выражений.
Пример: settings set target.language swift.
🔹 expr -l Swift — myArray.map { $0 + 1 }
Use Case: для вычисления выражения Swift без изменения кода.
Пример: если у вас есть массив myArray, вы можете использовать expr -l Swift -- myArray.map { $0 + 1 }, чтобы добавить 1 к каждому элементу.
🔹 image list -o -f
Use Case: для просмотра списка загруженных модулей с путями к их файлам для устранения неполадок.
Пример: использование image list -o -f, для просмотра всех загруженных модулей и путей к ним.
🔹 register read
Use Case: когда нужно проверить значения регистров процессора, чтобы понять состояние софта.
Пример: использование register read для проверки значений регистра во время сбоя или неожиданного поведения.
🔹 memory write -s 4–0x12345678 0xdeadbeef
Use Case: для изменения определенного адреса памяти во время отладки.
Пример: использование memory write -s 4 -- 0x12345678 0xdeadbeef, чтобы изменить данные по адресу 0x12345678 на 0xdeadbeef.
🔹 watchpoint modify -c ‘(old_val != new_val)’ variable
Use Case: когда необходимо отслеживать изменения значения переменной с определенным условием.
Пример: изменение watchpoint в myVariable, чтобы она запускалась при изменении ее значения, используя watchpoint modify -c '(old_val != new_val)' myVariable.
🔹 disassemble -c 10 — name functionName
Use Case: для проверки ассемблерного кода конкретной функции, чтобы понять ее поведение.
Пример: разбор первых 10 инструкций функции с именем myFunction с помощью disassemble -c 10 --name myFunction.
🔹 breakpoint command add — one-shot true 1.1
Use Case: когда необходимо выполнить определенную команду один раз при достижении точки останова.
Пример: добавление команды в точку останова 1.1, которая выводит сообщение с помощью breakpoint command add --one-shot true 1.1.
🔹 type lookup -r ‘^Swift.Array’
Use Case: необходимо найти все типы Swift, соответствующие определенному шаблону.
Пример: найти все типы, начинающиеся со Swift.Array, используя поиск по типу -r ^Swift.Array.
#туториал
👍11❤2
Откуда получаете новые знания
Anonymous Poll
73%
YouTube
44%
Medium
58%
Телеграм каналы
4%
Twitter
16%
Конференции
31%
Курсы
45%
Книги
7%
Свой вариант
❤3👍3🥰1😁1
😎💪🔥 Интеграция Jetpack Compose UI в существующую базу Epoxy
Шаг 1: Рассмотрим модель Epoxy в текущей кодовой базе, которая имеет Epoxy RecyclerView для отображения списка элементов:
@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class SampleEpoxyModel : EpoxyModelWithHolder() {
@EpoxyAttribute
lateinit var title: String
override fun bind(holder: Holder) {
holder.titleTextView.text = title
}
class Holder : EpoxyHolder() {
lateinit var titleTextView: TextView
override fun bindView(itemView: View) {
titleTextView = itemView.findViewById(R.id.titleTextView)
}
}
}
Шаг 2: Создадим простой компонент compose, который нужно интегрировать в приведенную выше модель:
@Composable
fun ComposeItem(name: String) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text(text = "Hello, $name!")
}
}
Шаг 3: Теперь интегрируем компонент UI Jetpack Compose в существующую модель:
@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class ComposeEpoxyModel : EpoxyModelWithHolder() {
@EpoxyAttribute
lateinit var title: String
override fun bind(holder: Holder) {
// Set up the Compose UI within the existing view holder
val composeContainer = holder.itemView.findViewById(R.id.composeContainer)
composeContainer.setContent {
ComposeItem(title = title)
}
}
class Holder : EpoxyHolder() {
lateinit var itemView: View
override fun bindView(itemView: View) {
this.itemView = itemView
}
}
}
Шаг 4: Создадим контроллер Epoxy, который заполняет RecyclerView экземплярами модели Epoxy
class MyEpoxyController : TypedEpoxyController>() {
override fun buildModels(data: List?) {
data?.forEach { name ->
composeEpoxyModel {
id(name)
name(name)
}
}
}
}
Шаг 5: Интегрируем контроллер Epoxy с RecyclerView в активити или фрагмент:
class MainActivity : AppCompatActivity() {
private val epoxyController = MyEpoxyController()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView: EpoxyRecyclerView = findViewById(R.id.recycler_view)
recyclerView.setController(epoxyController)
val data = listOf("Alice", "Bob", "Charlie")
epoxyController.setData(data)
}
}
#туториал
Шаг 1: Рассмотрим модель Epoxy в текущей кодовой базе, которая имеет Epoxy RecyclerView для отображения списка элементов:
@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class SampleEpoxyModel : EpoxyModelWithHolder() {
@EpoxyAttribute
lateinit var title: String
override fun bind(holder: Holder) {
holder.titleTextView.text = title
}
class Holder : EpoxyHolder() {
lateinit var titleTextView: TextView
override fun bindView(itemView: View) {
titleTextView = itemView.findViewById(R.id.titleTextView)
}
}
}
Шаг 2: Создадим простой компонент compose, который нужно интегрировать в приведенную выше модель:
@Composable
fun ComposeItem(name: String) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text(text = "Hello, $name!")
}
}
Шаг 3: Теперь интегрируем компонент UI Jetpack Compose в существующую модель:
@EpoxyModelClass(layout = R.layout.epoxy_item_layout)
abstract class ComposeEpoxyModel : EpoxyModelWithHolder() {
@EpoxyAttribute
lateinit var title: String
override fun bind(holder: Holder) {
// Set up the Compose UI within the existing view holder
val composeContainer = holder.itemView.findViewById(R.id.composeContainer)
composeContainer.setContent {
ComposeItem(title = title)
}
}
class Holder : EpoxyHolder() {
lateinit var itemView: View
override fun bindView(itemView: View) {
this.itemView = itemView
}
}
}
Шаг 4: Создадим контроллер Epoxy, который заполняет RecyclerView экземплярами модели Epoxy
class MyEpoxyController : TypedEpoxyController>() {
override fun buildModels(data: List?) {
data?.forEach { name ->
composeEpoxyModel {
id(name)
name(name)
}
}
}
}
Шаг 5: Интегрируем контроллер Epoxy с RecyclerView в активити или фрагмент:
class MainActivity : AppCompatActivity() {
private val epoxyController = MyEpoxyController()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView: EpoxyRecyclerView = findViewById(R.id.recycler_view)
recyclerView.setController(epoxyController)
val data = listOf("Alice", "Bob", "Charlie")
epoxyController.setData(data)
}
}
#туториал
👍16🔥2❤1
😎 Очередной #дайджест по Kotlin, Swift и кроссплатформе
✍️ Лучшие практики обработки ошибок в Kotlin — реализация обработки ошибок с помощью Sealed классов, функций высшего порядка, Retrofit и прочих инструментов
✍️ Простой Jetpack Compose Tabs на фрагментах — создание для приложения верхнего меню из табов на фрагментах и активити
✍️ AppFlowy — опенсорсная альтернатива Notion
✍️ Тестирование Flutter-приложений c помощью Appium — автоматизация тестирования опенсорсным клиент-серверным инструментом
✍️ Продвинутые акторы в Swift — вариант использования акторов на примере приложений с аутентификацией
✍️ Как стать лучшим разработчиком iOS — некоторые интересные и важные советы разработчика для развития
✍️ Лучшие практики обработки ошибок в Kotlin — реализация обработки ошибок с помощью Sealed классов, функций высшего порядка, Retrofit и прочих инструментов
✍️ Простой Jetpack Compose Tabs на фрагментах — создание для приложения верхнего меню из табов на фрагментах и активити
✍️ AppFlowy — опенсорсная альтернатива Notion
✍️ Тестирование Flutter-приложений c помощью Appium — автоматизация тестирования опенсорсным клиент-серверным инструментом
✍️ Продвинутые акторы в Swift — вариант использования акторов на примере приложений с аутентификацией
✍️ Как стать лучшим разработчиком iOS — некоторые интересные и важные советы разработчика для развития
👍27🥰3❤1
Swift 6: готовьте ваши Xcode проекты
Обнова станет следующим крупным релизом. Многие из функций, которые уже знакомы сегодня, являются частью пути к этому событию.
Чего ожидать от Swift 6?
Все релизы Swift 5.x готовятся к выпуску Swift 6 и достижению целей, поставленных на пути к Swift 6. Первоначальный выпуск поддержки конкурентности улучшен за счет proposals. Вы можете ожидать аналогичных улучшений для выпуска Swift 5.8 existentials и opaque types, который последовал за манифестом, а также для новой поддержки макросов в Swift 5.9.
Готовьтесь заранее
Не нужно ждать появления Swift 6, чтобы наброситься в авралах на нововведения, а поэтапно адаптируйтесь к новым функциям. Наиболее яркими примерами являются выпуск async/await, existential и макросы. Несмотря на то, что миграция не требуется, можно начать использовать новые языковые возможности, чтобы подготовить свой проект к будущему.
Подробнее
#обновление
Обнова станет следующим крупным релизом. Многие из функций, которые уже знакомы сегодня, являются частью пути к этому событию.
Чего ожидать от Swift 6?
Все релизы Swift 5.x готовятся к выпуску Swift 6 и достижению целей, поставленных на пути к Swift 6. Первоначальный выпуск поддержки конкурентности улучшен за счет proposals. Вы можете ожидать аналогичных улучшений для выпуска Swift 5.8 existentials и opaque types, который последовал за манифестом, а также для новой поддержки макросов в Swift 5.9.
Готовьтесь заранее
Не нужно ждать появления Swift 6, чтобы наброситься в авралах на нововведения, а поэтапно адаптируйтесь к новым функциям. Наиболее яркими примерами являются выпуск async/await, existential и макросы. Несмотря на то, что миграция не требуется, можно начать использовать новые языковые возможности, чтобы подготовить свой проект к будущему.
Подробнее
#обновление
🥰8👍3🌚2
👈 🧠 👉 Расширенное управление памятью с помощью Unsafe Swift
Управление памятью — важнейший аспект разработки программного обеспечения, обеспечивающий эффективное использование системных ресурсов и предотвращающий такие ошибки, как утечки памяти и сбои. В Swift управление памятью обычно абстрагируется посредством автоматического подсчета ссылок и безопасных абстракций.
В статье рассматриваются расширенные возможности Swift по управлению памятью посредством использования его «небезопасных» конструкций, таких как UnsafeMutablePointer и UnsafeRawPointer.
Роль Unsafe Swift
Управление памятью в Swift в первую очередь обеспечивается автоматическим подсчетом ссылок и строгой системой типов, которые помогают предотвратить распространенные ошибки, связанные с памятью, такие как утечки и разыменования нулевых указателей. Однако бывают случаи, когда необходимы прямые низкоуровневые манипуляции с памятью, часто при взаимодействии с API C, оптимизации критически важного для производительности кода или реализации пользовательских структур данных.
Меры предосторожности и предостережения
Хотя использование небезопасных конструкций Swift, таких как UnsafeMutablePointer и UnsafeRawPointer, может быть эффективным, важно проявлять осторожность из-за повышенной ответственности, которую они возлагают на разработчика. Обходя встроенные функции безопасности памяти Swift, вы попадаете на территорию, где ошибки могут привести к сбоям, повреждению памяти или уязвимостям безопасности.
Соединение Swift и C
Когда дело доходит до взаимодействия с библиотеками C из Swift, решающее значение имеет фундаментальное понимание структуры памяти и структур данных. UnsafeMutablePointer и UnsafeRawPointer в Swift предлагают способы устранить разрыв между высокоуровневым управлением памятью в Swift и низкоуровневым манипулированием памятью в C.
Управление указателями для вызовов функций C
Передача данных между функциями Swift и C часто включает преобразование структур данных Swift в форматы, совместимые с C, что часто требует работы с указателями. UnsafeMutablePointer в Swift — мощный инструмент для этой цели, но правильное владение памятью и управление временем жизни имеют решающее значение для предотвращения сбоев и утечек памяти.
Подробнее
#обучалка
Управление памятью — важнейший аспект разработки программного обеспечения, обеспечивающий эффективное использование системных ресурсов и предотвращающий такие ошибки, как утечки памяти и сбои. В Swift управление памятью обычно абстрагируется посредством автоматического подсчета ссылок и безопасных абстракций.
В статье рассматриваются расширенные возможности Swift по управлению памятью посредством использования его «небезопасных» конструкций, таких как UnsafeMutablePointer и UnsafeRawPointer.
Роль Unsafe Swift
Управление памятью в Swift в первую очередь обеспечивается автоматическим подсчетом ссылок и строгой системой типов, которые помогают предотвратить распространенные ошибки, связанные с памятью, такие как утечки и разыменования нулевых указателей. Однако бывают случаи, когда необходимы прямые низкоуровневые манипуляции с памятью, часто при взаимодействии с API C, оптимизации критически важного для производительности кода или реализации пользовательских структур данных.
Меры предосторожности и предостережения
Хотя использование небезопасных конструкций Swift, таких как UnsafeMutablePointer и UnsafeRawPointer, может быть эффективным, важно проявлять осторожность из-за повышенной ответственности, которую они возлагают на разработчика. Обходя встроенные функции безопасности памяти Swift, вы попадаете на территорию, где ошибки могут привести к сбоям, повреждению памяти или уязвимостям безопасности.
Соединение Swift и C
Когда дело доходит до взаимодействия с библиотеками C из Swift, решающее значение имеет фундаментальное понимание структуры памяти и структур данных. UnsafeMutablePointer и UnsafeRawPointer в Swift предлагают способы устранить разрыв между высокоуровневым управлением памятью в Swift и низкоуровневым манипулированием памятью в C.
Управление указателями для вызовов функций C
Передача данных между функциями Swift и C часто включает преобразование структур данных Swift в форматы, совместимые с C, что часто требует работы с указателями. UnsafeMutablePointer в Swift — мощный инструмент для этой цели, но правильное владение памятью и управление временем жизни имеют решающее значение для предотвращения сбоев и утечек памяти.
Подробнее
#обучалка
Хабр
Расширенное управление памятью с помощью Unsafe Swift
Введение Управление памятью — важнейший аспект разработки программного обеспечения, обеспечивающий эффективное использование системных ресурсов и предотвращающий такие ошибки, как утечки памяти и...
❤6👍4
🎉🎉 Можете юзать Android 14. Кодовое имя в этот раз: Upside Down Cake. В релизе более 60 обновленных фич, среди них: интернационализация, переработанный UI/UX и графика, кастомные экшены, обновления в OpenJDK 17и масса другого.
И еще немного новостей в формате видео:
Predictive Back Gesture
Ограничение на установку старых приложений
Нелинейное масштабирование размера текста
Foreground Service
BroadcastReciever
Data Safety в системе
Унификация работы Foreground Service
#новости
И еще немного новостей в формате видео:
Predictive Back Gesture
Ограничение на установку старых приложений
Нелинейное масштабирование размера текста
Foreground Service
BroadcastReciever
Data Safety в системе
Унификация работы Foreground Service
#новости
❤6🎉2🥰1👏1
Предлагаем рассмотреть возможности Android Studio, позволяющие быстрее ориентироваться в коде: находить нужные фрагменты и выявлять связи между ними.
Что тут как
В Android Studio есть горячих клавиш, ускоряющих процесс изучения незнакомого кода. C их помощью можно быстрее находить строки кода, функции, файлы.
Хлебные крошки для блоков кода
Как воспользоваться: кликнуть ПКМ на любой номер строки -> Breadcrumbs -> Top/Bottom.
После активации Breadcrumbs появляется динамическое отображение «хлебных крошек» блока кода в фокусе.
Удобно использовать, если в одном файле несколько классов: сразу видно, в каком классе расположен блок кода.
Открыть текущий файл в древе
Первый вариант: чтобы Android Studio развернула древо до открытого в редакторе файла, нужно нажать кнопку Select Opened File.
Второй вариант: Ctrl (Windows) / Command (macOS) + кликнуть ЛКМ на название пакета. Студия развернёт выбранную папку.
Умный поиск
Как воспользоваться:
Дважды нажать кнопку Shift.
В появившемся окне можно написать:
➖ название файла/класса/функции/переменной;
➖ id View/ресурса;
➖ название функции Android Studio;
➖ название функции VCS (например, Compared with Branch).
Подробнее
#туториал
Что тут как
В Android Studio есть горячих клавиш, ускоряющих процесс изучения незнакомого кода. C их помощью можно быстрее находить строки кода, функции, файлы.
Хлебные крошки для блоков кода
Как воспользоваться: кликнуть ПКМ на любой номер строки -> Breadcrumbs -> Top/Bottom.
После активации Breadcrumbs появляется динамическое отображение «хлебных крошек» блока кода в фокусе.
Удобно использовать, если в одном файле несколько классов: сразу видно, в каком классе расположен блок кода.
Открыть текущий файл в древе
Первый вариант: чтобы Android Studio развернула древо до открытого в редакторе файла, нужно нажать кнопку Select Opened File.
Второй вариант: Ctrl (Windows) / Command (macOS) + кликнуть ЛКМ на название пакета. Студия развернёт выбранную папку.
Умный поиск
Как воспользоваться:
Дважды нажать кнопку Shift.
В появившемся окне можно написать:
➖ название файла/класса/функции/переменной;
➖ id View/ресурса;
➖ название функции Android Studio;
➖ название функции VCS (например, Compared with Branch).
Подробнее
#туториал
🥰21❤18🤩11🔥10👏10
В ролике пойдет речь о Swift, а конкретно — о простой реализации архитектурного паттерна MVVM на примере табличного приложения с запросами, парсингом данных и отображением их на экране.
Кстати, такие задачи любят давать на собесе, в качестве тестового: отобразить какие-то данные в коллекции или таблице, парсинг, запросы, отображение и передача между экранами. Все это на джуна...
Смотреть
#туториал
Кстати, такие задачи любят давать на собесе, в качестве тестового: отобразить какие-то данные в коллекции или таблице, парсинг, запросы, отображение и передача между экранами. Все это на джуна...
Смотреть
#туториал
❤5👍3🥰2
Нашли для вас видос о судьбе программиста, живущего в Новой Зеландии — 1С-разработчик, который красил заборы, доил коров, а потом стал мобильным разработчиком 😂😂😉
Он приехал на 1 год для учебы в IT, получил рабочую визу, нашел работу и подал на резидентство. Через 5 лет можно получить гражданство и ехать в Австралию — цель гостя ролика.
Смотреть
Он приехал на 1 год для учебы в IT, получил рабочую визу, нашел работу и подал на резидентство. Через 5 лет можно получить гражданство и ехать в Австралию — цель гостя ролика.
Смотреть
👍7👏4❤2
На митапе от Ozon Tech подробно обсудили дизайн-систему — продукт, который структурирует набор компонентов и гайдлайнов. Это позволяет дизайнерам и разработчикам создавать последовательный и согласованный визуальный язык для продуктов и услуг компании.
Программа встречи:
🔹 «Декларативная дизайн-система: Figma + SwiftUI/Jetpack Compose». Рассказ об особенностях дизайн-системы, разрабатываемой с помощью декларативных технологий – SwiftUI и Jetpack Compose. Общую структуру компонентов дизайн-системы, как компоненты в Figma соотносятся с кодом.
🔹 «Snapshot-тесты и как они помогают тестировать дизайн-систему». Внедрение snapshot-тестов, тестирование дизайн-системы и как решаются возникающие проблемы.
🔹 «Дизайн-система с BDUI, как готовить». Какие ограничения BDUI добавляет на дизайн-систему и особенности такой дизайн-системы. Какие ошибки совершаются и советы, как готовить с BDUI и без.
#мероприятие
Программа встречи:
🔹 «Декларативная дизайн-система: Figma + SwiftUI/Jetpack Compose». Рассказ об особенностях дизайн-системы, разрабатываемой с помощью декларативных технологий – SwiftUI и Jetpack Compose. Общую структуру компонентов дизайн-системы, как компоненты в Figma соотносятся с кодом.
🔹 «Snapshot-тесты и как они помогают тестировать дизайн-систему». Внедрение snapshot-тестов, тестирование дизайн-системы и как решаются возникающие проблемы.
🔹 «Дизайн-система с BDUI, как готовить». Какие ограничения BDUI добавляет на дизайн-систему и особенности такой дизайн-системы. Какие ошибки совершаются и советы, как готовить с BDUI и без.
#мероприятие
❤5🔥3👏3
😎 Очередной #дайджест по мобильной разработке
✍️ 10 советов по повышению качества вашего iOS-кода — шаблоны расширения для группировки фрагментов кода, создавать переменные и функции с описательными именами и прочие.
✍️ Что происходит, когда вы запускаете программу — как работает процессор, как несколько процессов работают одновременно, зачем нужен libc, как идет взаимодействие с памятью
✍️ Рефакторинг многомодульного проекта с Konsist — как использовать Konsist в реальном проекте
✍️ Продвинутые трюки lldb для Swift — хороший разбор возможностей, вспомогательных методов и их сочетания с брейкпоинтами
✍️ Потокобезопасность swift через - lock — блокировка доступа к переменной во время чтения или записи для гарантированного эксклюзивного доступа
✍️ 10 советов по повышению качества вашего iOS-кода — шаблоны расширения для группировки фрагментов кода, создавать переменные и функции с описательными именами и прочие.
✍️ Что происходит, когда вы запускаете программу — как работает процессор, как несколько процессов работают одновременно, зачем нужен libc, как идет взаимодействие с памятью
✍️ Рефакторинг многомодульного проекта с Konsist — как использовать Konsist в реальном проекте
✍️ Продвинутые трюки lldb для Swift — хороший разбор возможностей, вспомогательных методов и их сочетания с брейкпоинтами
✍️ Потокобезопасность swift через - lock — блокировка доступа к переменной во время чтения или записи для гарантированного эксклюзивного доступа
🥰8❤4👏4🔥3😁3