В языке Swift множества (sets) могут содержать только элементы одного типа. Это обусловлено тем, что множества реализованы как обобщённые (generic) коллекции.
Swift использует обобщения (generics) для своих коллекций, таких как массивы (arrays), множества (sets) и словари (dictionaries). Это означает, что при создании множества вы указываете тип элементов, которые оно будет содержать, и все элементы должны быть этого типа.
Это помогает обеспечить типобезопасность (type safety). Когда тип элементов известен, компилятор может проверять правильность операций с элементами во время компиляции, предотвращая множество потенциальных ошибок на этапе исполнения.
Для создания множества необходимо указать тип элементов. Например, если мы хотим создать множество строк
var stringSet: Set<String> = ["Apple", "Banana", "Cherry"]
Если мы попробуем добавить в это множество элемент другого типа, компилятор выдаст ошибку
// Ошибка: Cannot convert value of type 'Int' to expected argument type 'String'
stringSet.insert(42)
Множество целых чисел
var intSet: Set<Int> = [1, 2, 3, 4, 5]
intSet.insert(6) // Это допустимо
Множество строк
var stringSet: Set<String> = ["Red", "Green", "Blue"]
stringSet.insert("Yellow") // Это допустимо
Множество пользовательских объектов
struct Person: Hashable {
let name: String
let age: Int
}
var peopleSet: Set<Person> = [Person(name: "John", age: 30), Person(name: "Jane", age: 25)]
peopleSet.insert(Person(name: "Doe", age: 40)) // Это допустимоСтавь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
2. DRY (Don't Repeat Yourself): избегание повторения кода.
3. KISS (Keep It Simple, Stupid): упрощение структуры и логики программ.
4. YAGNI (You Aren't Gonna Need It): не добавляйте функционал, пока он не нужен.
5. Separation of Concerns: разделение логики программы на модули с отдельной ответственностью.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Да, Swift, язык программирования, используемый для разработки приложений на iOS, является строго типизированным языком. Это означает, что каждое значение в Swift имеет определенный тип, который определяет, какие операции можно выполнять с этим значением. Типобезопасность Swift помогает разработчикам избегать ошибок и писать более надежный код.
В Swift переменные и константы имеют определенный тип, который указывается при их объявлении. Если тип не указан явно, Swift может попытаться вывести тип автоматически на основе присваиваемого значения.
var explicitString: String = "Hello, World!" // Явное указание типа
var inferredInt = 42 // Неявное указание типа, Swift выводит тип как Int
Компилятор Swift проверяет правильность типов во время компиляции. Это позволяет обнаруживать многие ошибки на ранних этапах разработки, до выполнения программы.
var number: Int = 10
// number = "Ten" // Ошибка: Невозможно присвоить значение типа 'String' переменной типа 'Int'
Swift требует явного преобразования типов, что предотвращает случайные ошибки.
let integer: Int = 42
let doubleValue: Double = Double(integer) // Явное преобразование Int в Double
Строгая типизация помогает выявлять ошибки на этапе компиляции, делая код более надежным и защищенным от множества потенциальных ошибок.
Знание типов на этапе компиляции позволяет компилятору лучше оптимизировать код.
Явное указание типов делает код более понятным и легким для чтения, так как разработчик и любой другой читатель кода всегда знают, с какими типами данных они работают.
Объявление переменных с явным указанием типов
let name: String = "Alice"
let age: Int = 30
let height: Double = 5.9
Использование выведения типов
let city = "New York" // Swift выводит тип как String
let population = 8_000_000 // Swift выводит тип как Int
Ошибка из-за несовместимости типов
let isOpen: Bool = true
// isOpen = 1 // Ошибка: Невозможно присвоить значение типа 'Int' переменной типа 'Bool'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В языке Swift массивы (arrays) являются типобезопасными коллекциями, что означает, что все элементы в массиве должны быть одного типа. Однако, если вам нужно хранить элементы разных типов в одном массиве, это можно сделать, используя некоторые обходные пути, такие как использование протоколов или объединённых типов. Рассмотрим это подробнее:
Обычно массивы в Swift содержат элементы одного типа. Это помогает компилятору проверять правильность типов и предотвращает множество ошибок.
var intArray: [Int] = [1, 2, 3, 4, 5]
var stringArray: [String] = ["Apple", "Banana", "Cherry"]
Попытка добавить элемент другого типа приведет к ошибке компиляции
// Ошибка: Cannot convert value of type 'String' to expected element type 'Int'
// intArray.append("Six")
Тип
Any может представлять любой тип данных в Swift. Однако, использование Any убирает преимущества типобезопасности. var mixedArray: [Any] = [1, "Two", 3.0, true]
for item in mixedArray {
if let intValue = item as? Int {
print("Integer value: \(intValue)")
} else if let stringValue = item as? String {
print("String value: \(stringValue)")
} else if let doubleValue = item as? Double {
print("Double value: \(doubleValue)")
} else if let boolValue = item as? Bool {
print("Boolean value: \(boolValue)")
}
}
Можно определить перечисление с ассоциированными значениями для хранения различных типов данных в массиве.
enum MixedType {
case intValue(Int)
case stringValue(String)
case doubleValue(Double)
case boolValue(Bool)
}
var mixedArray: [MixedType] = [
.intValue(1),
.stringValue("Two"),
.doubleValue(3.0),
.boolValue(true)
]
for item in mixedArray {
switch item {
case .intValue(let intValue):
print("Integer value: \(intValue)")
case .stringValue(let stringValue):
print("String value: \(stringValue)")
case .doubleValue(let doubleValue):
print("Double value: \(doubleValue)")
case .boolValue(let boolValue):
print("Boolean value: \(boolValue)")
}
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Вызывается при запуске приложения, для начальной настройки.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
} Когда приложение становится активным.
func applicationDidBecomeActive(_ application: UIApplication) {
// Восстановление задач
} Когда приложение станет неактивным.
func applicationWillResignActive(_ application: UIApplication) {
// Приостановка задач
} Когда приложение уходит в фоновый режим.
func applicationDidEnterBackground(_ application: UIApplication) {
// Сохранение данных
} Когда приложение возвращается на передний план.
func applicationWillEnterForeground(_ application: UIApplication) {
// Подготовка к возвращению
}
Когда приложение завершает работу.
func applicationWillTerminate(_ application: UIApplication) {
// Завершение задач
} Вызывается после загрузки представления.
override func viewDidLoad() {
super.viewDidLoad()
// Настройка интерфейса
}
Перед тем, как представление станет видимым.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Обновление данных
} После того, как представление стало видимым.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Запуск задач
} Перед тем, как представление станет невидимым.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Сохранение данных
} После того, как представление стало невидимым.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// Освобождение ресурсов
} Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В Swift, термин "wrapped" обычно используется в контексте "обёрнутых" значений, особенно связанных с опционалами и декораторами.
В Swift опционалы (Optionals) позволяют переменной принимать либо значение определенного типа, либо значение
nil. Опционалы "оборачивают" значение, указывая, что переменная может не содержать значения вовсе.var name: String? = "Alex"
Принудительное разворачивание (force unwrapping)
if name != nil {
print(name!) // Использование "!" для принудительного разворачивания
}Безопасное разворачивание (optional binding)
if let unwrappedName = name {
print(unwrappedName)
}Property Wrappers — это механизм, позволяющий добавлять поведение к свойствам классов и структур.
@propertyWrapper
struct Uppercased {
private var value: String = ""
var wrappedValue: String {
get { value }
set { value = newValue.uppercased() }
}
}
struct User {
@Uppercased var username: String
}
var user = User(username: "alex")
print(user.username) // Выведет "ALEX"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Тип данных: массивы содержат элементы одного типа, а коллекции могут быть обобщёнными (Generic).
Функциональность: массивы предоставляют базовый доступ по индексу, тогда как коллекции предлагают методы для сортировки, фильтрации и поиска.
Структура: массивы — линейные, коллекции включают списки, множества, словари и другие сложные структуры.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В контексте iOS и Swift, термин "scapin" не является общепринятым или стандартным. Возможно, вы имели в виду что-то другое. Могу предположить, что это опечатка или автокоррекция какого-то другого термина. Если у вас есть дополнительная информация или контекст, пожалуйста, поделитесь, чтобы я мог точнее ответить на ваш вопрос.
В Swift замыкания (closures) могут быть обозначены как "escaping" или "не escaping". Это важно для управления временем жизни и областью видимости замыкания.
По умолчанию замыкания не "escaping", что означает, что они должны быть выполнены до выхода из функции, в которую они переданы. Такой тип замыканий позволяет компилятору проводить более агрессивные оптимизации.
func performAction(closure: () -> Void) {
closure()
}
Замыкания, помеченные как
@escaping, могут быть выполнены после выхода из функции, в которую они переданы. Это необходимо, когда замыкание сохраняется и вызывается позже, например, асинхронно. func performActionWithEscaping(closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
closure()
}
}
Область видимости (scope) определяет, где переменные и константы могут быть доступны в коде. В Swift существуют различные области видимости:
Переменные, объявленные внутри функции или блока кода, доступны только в пределах этого блока.
func exampleFunction() {
let localVariable = "I am local"
print(localVariable)
}
Переменные, объявленные внутри класса или структуры, доступны для всех методов и свойств этого класса или структуры.
class ExampleClass {
var instanceVariable = "I am an instance variable"
func printInstanceVariable() {
print(instanceVariable)
}
}
Переменные, объявленные вне всех функций, классов и структур, доступны в любом месте в файле.
let globalVariable = "I am global"
func printGlobalVariable() {
print(globalVariable)
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21🤔2❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Это термин, используемый для описания процесса разработки программного обеспечения, который осуществляется командами, распределёнными по всему миру. В таких командах разработчики, тестировщики, менеджеры проектов и другие участники могут находиться в разных странах и работать в разных часовых поясах.
Команды могут состоять из участников, работающих в разных географических регионах. Это позволяет привлекать таланты со всего мира и использовать временные зоны для круглосуточной работы.
Работа в глобальных командах требует понимания и уважения к культурным различиям и языковым барьерам. Это может влиять на коммуникацию и взаимодействие внутри команды.
Для эффективного управления глобальными командами используются различные инструменты, такие как системы управления проектами (например, Jira, Trello), платформы для совместной работы (например, Slack, Microsoft Teams), системы контроля версий (например, GitHub, GitLab) и другие.
Работа в разных часовых поясах может быть как преимуществом, так и вызовом. Важно организовать работу так, чтобы минимизировать время ожидания и использовать разницу во времени для повышения эффективности.
В GSD часто используются гибкие методы управления проектами, такие как Agile или Scrum, которые позволяют адаптироваться к быстро меняющимся требованиям и обеспечивать регулярную доставку программного обеспечения.
Возможность привлекать специалистов из разных стран.
За счёт работы в разных часовых поясах проекты могут продвигаться круглосуточно.
Возможность оптимизации затрат за счёт найма специалистов в регионах с более низкими ставками.
Различия в языке и культуре могут усложнять взаимодействие.
Организация работы с учётом разных часовых поясов требует тщательного планирования.
Сложности в координации работы между удалёнными командами.
Предположим, крупная международная компания разрабатывает новое программное обеспечение. Команда разработчиков из США работает над основным функционалом, тестировщики из Индии занимаются тестированием, а команда из Европы отвечает за проектирование пользовательского интерфейса. Каждая команда выполняет свою часть работы и взаимодействует с другими командами с помощью инструментов для совместной работы и регулярных видеоконференций.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯5😁1
1. Свойства (только вычисляемые).
2. Инициализаторы.
3. Поддержку протоколов.
4. Вложенные типы (структуры, классы, перечисления).
5. Сабскрипты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В глобальной разработке программного обеспечения (GSD) используются различные инструменты для управления проектами, коммуникации, совместной работы, контроля версий и автоматизации.
Разработан Atlassian. Используется для управления проектами, отслеживания задач и ошибок. Поддерживает методологии Agile и Scrum. Имеет гибкую систему настраиваемых досок и отчетов.
Визуальная система управления проектами на основе досок Kanban. Легкость в использовании и наглядность. Подходит для небольших команд и простых проектов.
Инструмент для управления задачами и проектами. Поддерживает список задач, проекты и временные линии. Интеграции с различными другими инструментами.
Платформа для мгновенных сообщений и групповых чатов. Поддержка каналов, тем и интеграций с другими сервисами. Возможность обмена файлами и организация видеозвонков.
Инструмент для общения и совместной работы от Microsoft. Поддержка чатов, видеоконференций и совместного редактирования документов. Интеграция с Microsoft Office 365.
Платформа для видеоконференций. Поддерживает большие встречи и вебинары. Возможности записи встреч и обмена экранами.
Платформа для хостинга и совместной работы над проектами на основе Git. Поддержка pull request'ов, issue tracker и Actions для автоматизации. Широко используется в open-source и коммерческих проектах.
Платформа для хостинга Git-репозиториев с дополнительными функциями CI/CD. Поддерживает полный жизненный цикл разработки программного обеспечения. Возможность хостинга на собственных серверах.
Система управления исходным кодом, разработанная Atlassian. Интеграция с Jira и другими инструментами Atlassian. Поддержка Git и Mercurial.
Инструмент для автоматизации сборки, тестирования и деплоя. Поддержка различных плагинов для интеграции с другими инструментами. Открытый исходный код и большая пользовательская база.
Платформа для непрерывной интеграции и непрерывного деплоя. Поддержка контейнеров и различных языков программирования. Возможности автоматизации на основе YAML-конфигураций.
Инструмент для CI/CD, интегрирующийся с GitHub. Автоматическая сборка и тестирование кода при каждом коммите. Поддержка различных языков и платформ.
Инструмент для создания и совместного редактирования документации. Интеграция с Jira и другими продуктами Atlassian. Поддержка организации информации в виде вики-страниц.
Многофункциональный инструмент для ведения заметок, управления задачами и создания документации. Поддержка различных типов контента и интеграций. Используется для личных и командных нужд.
Набор инструментов для совместной работы над документами, таблицами и презентациями. Реальное время редактирования и комментарии. Интеграция с другими сервисами Google.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
В iOS для работы с большими наборами данных в виде списков часто используются
UITableView и UICollectionView. Эти компоненты эффективно обрабатывают и отображают большие объемы данных за счёт повторного использования ячеек. Создайте новый проект в Xcode. Добавьте
UITableView в ваш ViewController через Interface Builder или программно.Создайте аутлет для таблицы в вашем
ViewController. Назначьте ViewController в качестве делегата и источника данных для таблицы. import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
// MARK: - UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1000 // Большое количество ячеек
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Row \(indexPath.row)"
return cell
}
}
Используйте метод
dequeueReusableCell(withIdentifier:for:) для повторного использования ячеек, что улучшает производительность. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Row \(indexPath.row)"
return cell
}
Создание и настройка `UICollectionView`
Добавьте
UICollectionView в ваш ViewController. Создайте аутлет для коллекции и настройте делегата и источник данных. import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
}
// MARK: - UICollectionViewDataSource
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 1000 // Большое количество элементов
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
cell.backgroundColor = .blue
return cell
}
// MARK: - UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 100) // Размер ячеек
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
В iOS разработке термины "View" (представление) и "Window" (окно) имеют разные значения и играют различные роли в пользовательском интерфейсе.
Это базовый строительный блок для построения пользовательского интерфейса в iOS. Представления ответственны за отрисовку контента на экране и обработку взаимодействий с пользователем, таких как касания, жесты и т.д.
Представления отвечают за отображение графики, текста, изображений и других визуальных элементов.
Представления могут содержать другие представления, образуя иерархию. Главное представление в иерархии называется супервью (
superview), а представления, вложенные в него, — подпредставления (subviews).Представления обрабатывают пользовательские события, такие как касания и жесты.
UIView и его подклассы отвечают за управление расположением и размером визуальных элементов.let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = .red
let subview = UIView(frame: CGRect(x: 10, y: 10, width: 50, height: 50))
subview.backgroundColor = .blue
view.addSubview(subview)
Это специальный тип представления, который служит контейнером для всех других представлений в приложении.
UIWindow представляет собой основу, на которой строится весь пользовательский интерфейс приложения.UIWindow содержит корневое представление (root view), которое в свою очередь может содержать другие представления.Окно управляет отображением содержимого на экране и взаимодействием с системными событиями.
Хотя обычно в приложении используется одно основное окно,
UIWindow позволяет создавать и управлять несколькими окнами, что может быть полезно для реализации сложных интерфейсов, таких как многооконные приложения на iPad.import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let viewController = UIViewController()
viewController.view.backgroundColor = .white
window?.rootViewController = viewController
window?.makeKeyAndVisible()
return true
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
1. some: хранит значение, если оно присутствует.
2. none: обозначает отсутствие значения, эквивалент nil.
Под капотом это работает как обёртка над значением, где используется дополнительный бит для указания на наличие или отсутствие данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1