1. some: хранит значение, если оно присутствует.
2. none: обозначает отсутствие значения, эквивалент nil.
Под капотом это работает как обёртка над значением, где используется дополнительный бит для указания на наличие или отсутствие данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Разрешение экранов iPhone варьируется в зависимости от модели. Вот основные модели iPhone с их разрешениями экранов (в пикселях):
Разрешение: 1136 x 640
Размер экрана: 4.0 дюйма
Плотность пикселей: 326 ppi
Разрешение: 1334 x 750
Размер экрана: 4.7 дюйма
Плотность пикселей: 326 ppi
Разрешение: 1920 x 1080
Размер экрана: 5.5 дюймов
Плотность пикселей: 401 ppi
Разрешение: 2436 x 1125
Размер экрана: 5.8 дюйма
Плотность пикселей: 458 ppi
Разрешение: 1792 x 828
Размер экрана: 6.1 дюйм
Плотность пикселей: 326 ppi
Разрешение: 2688 x 1242
Размер экрана: 6.5 дюймов
Плотность пикселей: 458 ppi
Разрешение: 2340 x 1080
Размер экрана: 5.4 дюйма
Плотность пикселей: 476 ppi
Разрешение: 2532 x 1170
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi
Разрешение: 2778 x 1284
Размер экрана: 6.7 дюймов
Плотность пикселей: 458 ppi
Разрешение: 2340 x 1080
Размер экрана: 5.4 дюйма
Плотность пикселей: 476 ppi
Разрешение: 2532 x 1170
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi
Разрешение: 2778 x 1284
Размер экрана: 6.7 дюймов
Плотность пикселей: 458 ppi
Разрешение: 2556 x 1179
Размер экрана: 6.1 дюйм
Плотность пикселей: 460 ppi
Разрешение: 2796 x 1290
Размер экрана: 6.7 дюймов
Плотность пикселей: 460 ppi
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👍1
1. Однако можно использовать диспетчерские источники (dispatch sources) или проверять флаг отмены до выполнения операции.
2. Для более сложного управления используйте OperationQueue, где задачи можно отменять до их начала.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Разница между точками (points) и пикселями (pixels) в iOS важна для понимания разрешения экрана и отображения графики.
Пиксели — это мельчайшие единицы изображения на экране. Каждый пиксель представляет собой одну точку цвета на дисплее.
Пиксели — это физические элементы на экране устройства.
Разрешение экрана указывается в пикселях (например, 1920 x 1080).
Точки — это логические единицы измерения, используемые в iOS для упрощения разработки интерфейсов. Они абстрагируются от физического разрешения экрана.
Точки позволяют дизайнерам и разработчикам создавать интерфейсы, которые будут одинаково хорошо выглядеть на устройствах с разным физическим разрешением.
Размеры и положения элементов интерфейса указываются в точках (например, 100 x 100 points).
Коэффициент масштабирования (
scale factor) определяет соотношение между точками и пикселями. Он показывает, сколько физических пикселей соответствует одной точке. Например:1 точка = 1 пиксель.
1 точка = 2 пикселя.
1 точка = 3 пикселя.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
2. Группы (Dispatch Groups): позволяют объединять задачи для синхронизации их выполнения.
3. Семафоры (Dispatch Semaphores): обеспечивают ограничение доступа к ресурсам.
4. Таймеры (Dispatch Timers): планирование периодических задач.
5. Барьеры (Dispatch Barriers): для управления конкурентными операциями.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Это атрибуты, используемые в разработке приложений на iOS для связывания элементов пользовательского интерфейса в Interface Builder с кодом на Swift или Objective-C. Они играют ключевую роль в интеграции визуального интерфейса и логики приложения.
Используется для создания соединений между элементами пользовательского интерфейса (например, кнопками, метками, таблицами и т.д.) в Interface Builder и свойствами в коде. Это позволяет вам программно взаимодействовать с этими элементами.
Позволяет связывать визуальные элементы с кодом, чтобы можно было программно изменять их свойства (например, текст, цвет, размеры).
Можно управлять состоянием и поведением элементов интерфейса из кода.
import UIKit
class ViewController: UIViewController {
// Связь кнопки с кодом
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Изменение свойств кнопки программно
myButton.setTitle("Нажми меня", for: .normal)
}
}
Используется для создания методов, которые будут вызваны в ответ на действия пользователя (например, нажатие кнопки, переключение переключателя и т.д.) в Interface Builder. Это позволяет вам определять логику обработки событий.
Позволяет связывать действия пользователя с методами в коде.
Можно программировать логику, которая будет выполняться при взаимодействии с элементами интерфейса.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
myButton.setTitle("Нажми меня", for: .normal)
}
// Метод, который будет вызван при нажатии на кнопку
@IBAction func buttonTapped(_ sender: UIButton) {
print("Кнопка была нажата")
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
1. Каждый шард хранит часть данных, и они могут находиться на разных серверах.
2. Это повышает масштабируемость и производительность базы данных.
3. Сложность шардирования заключается в управлении распределением данных и маршрутизации запросов к нужным шардам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5
Это возможность центрального процессора (ЦПУ) или программы выполнять несколько задач (потоков) одновременно. В контексте программирования она используется для улучшения производительности приложений за счёт параллельной обработки задач. Это особенно важно для задач, требующих интенсивных вычислений, или приложений, которые должны одновременно реагировать на множество входных данных, таких как пользовательский интерфейс.
Минимальная единица обработки, которая может быть выполнена операционной системой.
Способность программы делать прогресс в нескольких задачах одновременно. Конкуренция достигается за счёт переключения между задачами.
Способность программы выполнять несколько операций одновременно, используя множество процессоров или ядер.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
1. Garbage Collector (GC): автоматически освобождает память, анализируя объекты, на которые больше нет ссылок. Он работает в фоне, но может вызывать задержки из-за пауз при сборке мусора.
2. ARC (Automatic Reference Counting): подсчитывает ссылки на объекты и освобождает их, когда счётчик ссылок достигает нуля. Это менее ресурсоёмко, так как выполняется в момент изменения ссылок, но требует осторожности для предотвращения циклических ссылок.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Важный аспект разработки iOS-приложений, особенно для поддержания плавности пользовательского интерфейса. Основной принцип заключается в том, что все операции, связанные с обновлением пользовательского интерфейса, должны выполняться на основном потоке (main thread). Другие задачи, такие как сетевые запросы, обработка данных или любые длительные операции, могут выполняться на фоновых потоках.
Это поток, в котором выполняются все операции пользовательского интерфейса. Все обновления интерфейса должны происходить на этом потоке, чтобы избежать конфликтов и обеспечить плавность анимаций и отзывчивость приложения.
Фоновые потоки используются для выполнения задач, которые могут занять значительное время, чтобы не блокировать основной поток. Это позволяет избежать зависаний и улучшить производительность приложения.
Это низкоуровневый API для управления многозадачностью. Он позволяет легко выполнять задачи асинхронно на различных очередях (queues).
Main Queue: Очередь, связанная с основным потоком.
Global Queues: Глобальные очереди для выполнения фоновых задач.
// Выполнение задачи в фоновом потоке
DispatchQueue.global(qos: .background).async {
// Долгая задача
let result = someLongRunningTask()
// Возвращение к основному потоку для обновления UI
DispatchQueue.main.async {
self.updateUI(with: result)
}
}
Это более высокоуровневый API для управления очередями операций (
Operation). Он предоставляет больше возможностей для управления зависимостями между задачами. let operationQueue = OperationQueue()
let operation = BlockOperation {
// Долгая задача
let result = someLongRunningTask()
// Возвращение к основному потоку для обновления UI
OperationQueue.main.addOperation {
self.updateUI(with: result)
}
}
operationQueue.addOperation(operation)
Асинхронная загрузка изображения
func loadImageAsync(url: URL) {
DispatchQueue.global(qos: .userInitiated).async {
if let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
DispatchQueue.main.async {
self.imageView.image = image
}
}
}
}
Обработка данных в фоновом режиме
func processDataInBackground(data: Data) {
DispatchQueue.global(qos: .utility).async {
let processedData = self.process(data)
DispatchQueue.main.async {
self.updateUI(with: processedData)
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
1. Размер можно посчитать с помощью MemoryLayout<MyType>.size.
2. Для протоколов это работает только при конкретизации типа, так как сами протоколы не имеют фиксированного размера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Когда клавиатура появляется и скрывает важную часть интерфейса в iOS-приложении, нужно сдвигать или изменять размер представлений, чтобы они оставались видимыми.
Подпишитесь на уведомления о появлении и скрытии клавиатуры, чтобы корректировать интерфейс:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
var activeTextField: UIView?
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
var aRect = self.view.frame
aRect.size.height -= keyboardSize.height
if let activeField = self.activeTextField, !aRect.contains(activeField.frame.origin) {
scrollView.scrollRectToVisible(activeField.frame, animated: true)
}
}
}
@objc func keyboardWillHide(notification: NSNotification) {
let contentInsets = UIEdgeInsets.zero
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
extension ViewController: UITextFieldDelegate, UITextViewDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
self.activeTextField = textField
}
func textViewDidBeginEditing(_ textView: UITextView) {
self.activeTextField = textView
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.activeTextField = nil
}
func textViewDidEndEditing(_ textView: UITextView) {
self.activeTextField = nil
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
1. Когда счётчик ссылок объекта достигает нуля, память, занимаемая объектом, автоматически освобождается.
2. Этот механизм используется в Swift и Objective-C.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
В старых версиях iOS (до iOS 6),
IBOutlet переменные обычно освобождались (релизились) в методе viewDidUnload, чтобы освободить память. Это было связано с управлением памятью и ресурсами на устройствах с ограниченными ресурсами. Устройства с ограниченными ресурсами могли столкнуться с нехваткой памяти. Освобождение ресурсов, связанных с представлениями, помогало улучшить производительность приложения и предотвращало его крах.
viewDidUnload вызывался, когда система освобождала память, удаляя невидимые представления. В этом методе освобождались ресурсы, которые можно было легко пересоздать при следующем отображении представления.До iOS 6, код мог выглядеть так
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel?
override func viewDidUnload() {
super.viewDidUnload()
// Освобождение IBOutlet
myLabel = nil
}
}С введением автоматического управления памятью (ARC) и изменений в iOS 6, метод
viewDidUnload был устаревшим и удалённым. Теперь система управления памятью в iOS гораздо эффективнее, и необходимость вручную освобождать IBOutlet-ы больше не актуальна. Вместо этого представления и связанные с ними ресурсы освобождаются автоматически, когда они больше не нужны.Сейчас мы просто используем ARC и не беспокоимся об освобождении IBOutlet-ов
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Настройка myLabel
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
1. Более высокий приоритет заставляет элемент занимать минимальное пространство.
2. Это полезно при настройке адаптивных интерфейсов и разрешении конфликтов автолейаута.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Это метод, который вызывается после того, как объект был загружен из файла XIB или NIB. Этот метод используется для выполнения дополнительной настройки после загрузки объекта.
Этот метод вызывается, когда объект создается из XIB или NIB файла. Это место для выполнения дополнительных операций по настройке, которые не могут быть выполнены в Interface Builder.
class CustomView: UIView {
@IBOutlet weak var label: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Дополнительная настройка
label.text = "Hello, World!"
}
}XIB файлы — это XML файлы, которые содержат описание интерфейса. XIB файлы редактируются в Interface Builder, который предоставляет визуальный способ создания и настройки интерфейсов. XIB файлы компилируются в NIB файлы во время сборки приложения.
NIB файлы — это двоичные файлы, которые содержат скомпилированное описание интерфейса. NIB файлы были использованы в ранних версиях macOS и iOS, а также в NeXTSTEP, на основе которого была построена macOS. Приложение загружает NIB файлы в память во время выполнения для создания и настройки интерфейсов.
XIB: XML-файл, который читается и редактируется в текстовом формате. NIB: Скомпилированный двоичный файл, который загружается в память во время выполнения.
XIB: Редактируется в Interface Builder. NIB: Содержит скомпилированные данные и не редактируется напрямую.
XIB: Используется для разработки и редактирования интерфейсов. NIB: Загружается и используется приложением во время выполнения.
class CustomView: UIView {
@IBOutlet weak var label: UILabel!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)
addSubview(label)
label.frame = self.bounds
}
override func awakeFromNib() {
super.awakeFromNib()
// Дополнительная настройка
label.text = "Hello, World!"
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
2. viewWillAppear: вызывается перед отображением на экране.
3. viewDidAppear: вызывается сразу после отображения.
4. viewWillDisappear и viewDidDisappear: перед и после удаления представления с экрана.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👾1
Это корневой класс для большинства классов в iOS. Он предоставляет базовую функциональность, такую как управление памятью (retain, release), метод доступа к информации о классе (class), и многое другое.
Этот класс отвечает за обработку событий, таких как касания экрана.
UIResponder является базовым классом для всех объектов, которые могут реагировать на события.UIView является базовым классом для всех визуальных элементов интерфейса. Он предоставляет функциональность для управления рамками, трансформациями, слоями (CALayer), анимациями и жестами.UIControl наследуется от UIView и добавляет поддержку механизма целевых действий (target-action) и управление состояниями (например, включено/выключено). Он является базовым классом для всех элементов управления, таких как кнопки, переключатели и слайдеры.Наконец,
UIButton наследуется от UIControl и представляет собой конкретную реализацию элемента управления, который реагирует на касания и может выполнять действия при нажатии. Он предоставляет дополнительные свойства и методы для настройки заголовка, изображения и фона кнопки.import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Создаем кнопку
let button = UIButton(type: .system)
button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
button.setTitle("Нажми меня", for: .normal)
// Добавляем целевое действие для кнопки
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
// Добавляем кнопку на экран
self.view.addSubview(button)
}
@objc func buttonTapped() {
print("Кнопка была нажата!")
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
1. Set быстрее для поиска и вставки, но порядок элементов не сохраняется.
2. Для упорядоченных данных предпочтителен Array.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3