Junior
Кои начини за предаване на данни познаваш?
sobes.tech AI
Отговор от AI
- Свойства (Properties):
- При инициализация (initializer injection).
- Присвояване след инициализация.
class ViewController: UIViewController { var data: String? // Предаване на данни чрез свойство } - Делегати (Delegation):
- Протокол с методи за уведомяване за събития и предаване на данни.
protocol DataDelegate: AnyObject { func didReceiveData(data: String) } class SenderViewController: UIViewController { weak var delegate: DataDelegate? func sendData() { delegate?.didReceiveData(data: "Здравей от Sender") } } class ReceiverViewController: UIViewController, DataDelegate { func didReceiveData(data: String) { print("Получени данни: \(data)") } } - Затваряния (Closures) / Callbacks:
- Предаване на функция, която ще бъде извикана на друго място.
class SenderViewController: UIViewController { var completionHandler: ((String) -> Void)? func sendData() { completionHandler?("Данни чрез затваряне") } } - NotificationCenter:
- Механизъм за публикуване и абониране за широковещателни известия.
// Изпращач NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Данни от известие"]) // Получател NotificationCenter.default.addObserver(self, selector: #selector(didReceiveNotification(_:)), name: NSNotification.Name("DataNotification"), object: nil) @objc func didReceiveNotification(_ notification: Notification) { if let data = notification.userInfo?["data"] as? String { print("Получени данни от известие: \(data)") } } - Сингълтън / Споделен екземпляр:
- Единствен екземпляр на класа, достъпен глобално.
class DataManager { static let shared = DataManager() var sharedData: String? private init() {} // Забранява създаването на други екземпляри } // Използване DataManager.shared.sharedData = "Данни от сингълтън" print(DataManager.shared.sharedData) - Наблюдение на стойности по ключ (KVO):
- Механизъм за наблюдение на промени в свойства на обекти.
class MyObservableObject: NSObject { @objc dynamic var value: String = "" // Свойството трябва да бъде `@objc dynamic` } class Observer: NSObject { var observation: NSKeyValueObservation? func startObserving(object: MyObservableObject) { observation = object.observe(\.value, options: [.new]) { observedObject, change in if let newValue = change.newValue { print("Стойността се промени на: \(newValue)") } } } } - Core Data / Realm / Други бази данни:
- За персистентно съхранение и обмен на данни между контролери и екрани.
- Mediator Pattern:
- Обект, който управлява взаимодействието между други обекти.
- Binding с реактивно програмиране (RxSwift, Combine):
- Предаване на данни чрез потоци (streams) или издатели (publishers).
// Пример с Combine import Combine let publisher = PassthroughSubject<String, Never>() // Абонат let subscriber = publisher.sink { receivedValue in print("Получена стойност чрез Combine: \(receivedValue)") } // Изпращач publisher.send("Данни от Combine") - Потребителски настройки (User Defaults):
- За съхранение на малко количество прости данни, достъпни глобално.
UserDefaults.standard.set("Потребителско име", forKey: "userName") let userName = UserDefaults.standard.string(forKey: "userName") - Обектите на средата (Environment Objects) в SwiftUI:
- За предаване на зависимости надолу по йерархията на изгледите в SwiftUI.
import SwiftUI class AppData: ObservableObject { @Published var message: String = "Начално съобщение" } struct ContentView: View { @EnvironmentObject var appData: AppData var body: some View { Text(appData.message) } }