Junior
Quali metodi di trasmissione dei dati conosci?
sobes.tech AI
Risposta dell'AI
- Proprietà:
- Durante l'inizializzazione (iniezione tramite inizializzatore).
- Assegnazione dopo l'inizializzazione.
class ViewController: UIViewController { var data: String? // Trasferimento dati tramite proprietà } - Delegati:
- Protocollo con metodi per notificare eventi e trasferire dati.
protocol DataDelegate: AnyObject { func didReceiveData(data: String) } class SenderViewController: UIViewController { weak var delegate: DataDelegate? func sendData() { delegate?.didReceiveData(data: "Ciao dal mittente") } } class ReceiverViewController: UIViewController, DataDelegate { func didReceiveData(data: String) { print("Dati ricevuti: \(data)") } } - Chiusure (Closures) / Callbacks:
- Trasferimento di funzione che sarà chiamata altrove.
class SenderViewController: UIViewController { var completionHandler: ((String) -> Void)? func sendData() { completionHandler?("Dati tramite closure") } } - NotificationCenter:
- Meccanismo di pubblicazione e sottoscrizione per notifiche broadcast.
// Mittente NotificationCenter.default.post(name: NSNotification.Name("DataNotification"), object: nil, userInfo: ["data": "Dati dalla notifica"]) // Destinatario 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("Dati della notifica ricevuti: \(data)") } } - Singleton / Istanza condivisa:
- Unica istanza della classe, accessibile globalmente.
class DataManager { static let shared = DataManager() var sharedData: String? private init() {} // Vietata la creazione di altre istanze } // Uso DataManager.shared.sharedData = "Dati dal Singleton" print(DataManager.shared.sharedData) - Osservazione Key-Value (KVO):
- Meccanismo per osservare le modifiche alle proprietà degli oggetti.
class MyObservableObject: NSObject { @objc dynamic var value: String = "" // La proprietà deve essere `@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("Valore cambiato in: \(newValue)") } } } } - Core Data / Realm / Altri database:
- Per memorizzazione persistente e scambio di dati tra controller e schermi.
- Pattern Mediatore:
- Oggetto che gestisce l'interazione tra altri oggetti.
- Binding con Programmazione Reattiva (RxSwift, Combine):
- Trasferimento di dati tramite flussi (streams) o publisher.
// Esempio con Combine import Combine let publisher = PassthroughSubject<String, Never>() // Sottoscrittore let subscriber = publisher.sink { receivedValue in print("Valore ricevuto tramite Combine: \(receivedValue)") } // Emittente publisher.send("Dati da Combine") - User Defaults:
- Per salvare piccole quantità di dati semplici, accessibili globalmente.
UserDefaults.standard.set("Nome utente", forKey: "userName") let userName = UserDefaults.standard.string(forKey: "userName") - Variabili di ambiente (Environment Objects) in SwiftUI:
- Per trasmettere dipendenze verso il basso nella gerarchia delle visualizzazioni in SwiftUI.
import SwiftUI class AppData: ObservableObject { @Published var message: String = "Messaggio iniziale" } struct ContentView: View { @EnvironmentObject var appData: AppData var body: some View { Text(appData.message) } }