и посмотреть медиа
Preguntas de entrevista de Swift
и посмотреть медиа
Preguntas, pruebas y tareas para desarrolladores de iOS en Telegram.
Preguntas, pruebas y tareas para desarrolladores de iOS en Telegram.
bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.
El canal está dedicado a la preparación de entrevistas en idioma Swift. Contiene preguntas actuales, pruebas, tareas prácticas e información de vacantes. Ideal para desarrolladores iOS principiantes y experimentados que quieren refrescar sus conocimientos y pasar con éxito entrevistas.
🤔 Что под капотом стэка? Это абстрактная структура данных, работающая по принципу LIFO (Last In, First Out), что означает "последний пришёл — первый вышел". Это значит, что последний добавленный элемент будет первым при извлечении из стека. Под капотом реализации стека могут быть разные, и они зависят от конкретного языка программирования и задач, которые необходимо решить. 🟠Массивы Один из самых распространённых способов реализации стека — это использование массива. В такой реализации элементы стека хранятся в массиве, и индекс последнего элемента (вершина стека) отслеживается отдельной переменной. struct Stack { private var storage: [Element] = [] mutating func push(_ element: Element) { storage.append(element) } mutating func pop() -> Element? { return storage.popLast() } func peek() -> Element? { return storage.last } var isEmpty: Bool { return storage.isEmpty } } 🟠Связные списки Стек можно реализовать с использованием связных списков, где каждый элемент списка содержит данные и ссылку на следующий элемент в стеке. Вершина стека в такой реализации — это начало связного списка. class Node { var value: Element var next: Node? init(value: Element) { self.value = value } } struct Stack { private var head: Node? mutating func push(_ element: Element) { let node = Node(value: element) node.next = head head = node } mutating func pop() -> Element? { let node = head head = head?.next return node?.value } func peek() -> Element? { return head?.value } var isEmpty: Bool { return head == nil } } 🟠Стек вызовов Это системный стек, который используется во время выполнения программы для хранения информации о вызовах функций/методов. Он хранит адреса возврата, параметры функций, локальные переменные и другие данные, необходимые для управления вызовами функций и их возврата. 🚩Зачем он нужен? Обратную польскую нотацию для вычисления арифметических выражений. Управление вызовами функций в программном стеке. Поддержка операций undo в приложениях. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое NSManagedObjectId, можем ли мы сохранить его на потом если приложение закроется? NSManagedObjectID – это уникальный идентификатор объекта в Core Data, который остаётся неизменным на протяжении всего жизненного цикла объекта. 🚩Как сохранить `NSManagedObjectID`? Используем uriRepresentation() – это строка (URL), которая уникально идентифицирует объект. func saveObjectID(_ object: NSManagedObject) { let objectID = object.objectID.uriRepresentation().absoluteString UserDefaults.standard.set(objectID, forKey: "savedObjectID") } 🚩Как восстановить объект по `NSManagedObjectID`? 1. Получаем URL из UserDefaults. 2. Преобразуем URL в NSManagedObjectID. 3. Загружаем объект из Core Data. func fetchSavedObjectID(context: NSManagedObjectContext) -> NSManagedObject? { guard let objectIDString = UserDefaults.standard.string(forKey: "savedObjectID"), let objectURL = URL(string: objectIDString) else { return nil } let objectID = context.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: objectURL) if let objectID = objectID { return context.object(with: objectID) } return nil } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какая разница между Dependency Inversion и Dependency Injection? Dependency Inversion — это принцип, согласно которому высокоуровневые модули не должны зависеть от низкоуровневых напрямую, а через абстракции. Dependency Injection — это механизм, с помощью которого зависимости передаются извне, реализуя этот принцип. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как сравниваются значения в dictionary? В Swift словарь (`Dictionary`) – это неупорядоченная коллекция пар `ключ → значение`, где ключи уникальны. 🟠Сравнение двух словарей (`==`) Swift позволяет сравнивать два словаря по их ключам и значениям, если и ключи, и значения соответствуют протоколу Equatable. let dict1 = ["name": "Alice", "age": "25"] let dict2 = ["name": "Alice", "age": "25"] let dict3 = ["name": "Bob", "age": "30"] print(dict1 == dict2) // ✅ true (значения одинаковые) print(dict1 == dict3) // ❌ false (разные значения) Ошибка при сравнении Dictionary без Equatable Если значения не соответствуют `Equatable`, сравнение не сработает: struct User { let name: String } let dict1 = ["user": User(name: "Alice")] let dict2 = ["user": User(name: "Alice")] // Ошибка: Type 'User' does not conform to protocol 'Equatable' // print(dict1 == dict2) Решение: Сделать User Equatable: struct User: Equatable { let name: String } print(dict1 == dict2) // Теперь работает! 🟠Поиск и сравнение отдельных значений Можно сравнивать отдельные элементы по ключу. let dict = ["name": "Alice", "age": "25"] if dict["name"] == "Alice" { print("Имя совпадает") // ✅ } 🟠Сравнение по ключам (`keys`) и значениям (`values`) Можно сравнить только ключи или только значения. let dict1 = ["name": "Alice", "age": "25"] let dict2 = ["age": "30", "name": "Alice"] print(dict1.keys == dict2.keys) // ✅ true (ключи одинаковые) Сравнение значений print(Set(dict1.values) == Set(dict2.values)) // ✅ true (если порядок неважен) 🟠Сравнение словарей с разными типами (`Any`) Если словарь хранит Any, то прямое сравнение не сработает, и нужно сравнивать элементы вручную. let dict1: [String: Any] = ["name": "Alice", "age": 25] let dict2: [String: Any] = ["name": "Alice", "age": 25] // Функция сравнения словарей с `Any` func areDictionariesEqual(_ dict1: [String: Any], _ dict2: [String: Any]) -> Bool { return NSDictionary(dictionary: dict1).isEqual(to: dict2) } print(areDictionariesEqual(dict1, dict2)) // ✅ true Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Какие есть способы верстать? В iOS существует несколько способов вёрстки пользовательского интерфейса. Каждый из них имеет свои плюсы и минусы в зависимости от проекта. 🟠Interface Builder (Storyboard & XIB) Используется: визуальный редактор в Xcode. Storyboard - Позволяет создавать весь UI в одном файле .storyboard. - Поддерживает Auto Layout и Size Classes для адаптивного дизайна. - Можно настраивать Segue (переходы между экранами). 🟠Верстка кодом (без Storyboard) Используется: Полностью программная вёрстка без использования Interface Builder. let button = UIButton() button.setTitle("Нажми", for: .normal) button.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button) NSLayoutConstraint.activate([ button.centerXAnchor.constraint(equalTo: view.centerXAnchor), button.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) 🟠SwiftUI – декларативный подход Используется: Современный способ верстки с декларативным синтаксисом. struct ContentView: View { var body: some View { VStack { Text("Привет, SwiftUI!") .font(.largeTitle) Button("Нажми меня") { print("Кнопка нажата") } } } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как можно создать любую переменную и записать туда любой тип данных? В Swift — через тип Any. Пример: var anything: Any = "string", потом anything = 42. Однако, чтобы использовать значение, нужно приведение типа (as?, as!). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что должны реализовывать переменные содержащиеся в протоколе? В Swift переменные (свойства), объявленные в протоколе, должны указывать: 🟠Только для чтения (`get`) Если свойство объявлено как { get }, класс или структура, реализующая протокол, должна предоставить как минимум геттер protocol Animal { var name: String { get } // Только чтение } struct Dog: Animal { let name = "Барсик" // Реализуем только get } let dog = Dog() print(dog.name) // "Барсик" Можно также использовать вычисляемое свойство: struct Cat: Animal { var name: String { return "Мурзик" } } 🟠Для чтения и записи (`get set`) Если свойство { get set }, класс или структура обязательно должны предоставить и get, и set. protocol Vehicle { var speed: Int { get set } // Чтение и запись } class Car: Vehicle { var speed: Int = 100 // Реализуем и get, и set } let car = Car() car.speed = 120 // Можно изменить значение print(car.speed) // 120 Вычисляемое свойство тоже подойдёт, если оно имеет get и set: class Bike: Vehicle { private var internalSpeed = 50 var speed: Int { get { return internalSpeed } set { internalSpeed = newValue } } } 🟠Статические свойства (`static`) Если свойство должно быть общим для всех экземпляров (не индивидуальным), то оно объявляется static. protocol Config { static var appVersion: String { get } } struct AppSettings: Config { static let appVersion = "1.0.0" } print(AppSettings.appVersion) // "1.0.0" Класс может использовать class var, если свойство можно переопределять в подклассах: class AppInfo: Config { class var appVersion: String { return "2.0.0" } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Есть ли в свифте множественное наследование? В Swift нет множественного наследования классов, но можно использовать множественное наследование через протоколы. 🚩Почему нет множественного наследования классов? Swift запрещает множественное наследование классов, потому что оно может привести к конфликтам и алмазной проблеме (diamond problem). Допустим, в языке с поддержкой множественного наследования у нас есть два родительских класса с одинаковым методом: class A { public: void greet() { cout
Открыть канал и посмотреть медиа🤔 Расскажи про структуры Структуры (struct) – это один из основных типов данных в Swift. Они значимые (value type), то есть при передаче копируются, а не передаются по ссылке. 🚩Главные особенности `struct` Value type – при передаче копируется (в отличие от классов) Нет ARC (автоматического подсчета ссылок) – производительность выше Могут иметь методы, свойства, инициализаторы Работают с протоколами (protocol-oriented programming) Не поддерживают наследование 🚩Пример структуры struct Car { var model: String var year: Int func description() -> String { return "\(model) – \(year)" } } let car1 = Car(model: "Tesla", year: 2023) var car2 = car1 // Создается копия print(car1.description()) // Tesla – 2023 print(car2.description()) // Tesla – 2023 car2.year = 2024 // Изменяем car2, но car1 остается прежним print(car1.year) // 2023 print(car2.year) // 2024 🚩Мутируемые структуры (`mutating`) По умолчанию методы не могут изменять свойства структуры. Чтобы изменить их внутри метода, нужно использовать mutating struct Counter { var count = 0 mutating func increment() { count += 1 } } var counter = Counter() counter.increment() print(counter.count) // 1 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!