L’applicazione sviluppata serve per monitorare e registrare il peso di un utente in un dato giorno. Offre la possibilità di aggiungere nuovi dati, modificarli ed eliminarli. Inoltre, per garantire la privacy dell’utente, si è integrato un sistema di autenticazione biometrica o tramite codice di sblocco del dispositivo.
Il codice sorgente, completo, può essere prelevato qui.
Struttura del Progetto
Il progetto è realizzato interamente in SwiftUI e sfrutta la persistenza dei dati attraverso UserDefaults
. La struttura principale è basata su due View
: ContentView
e EditView
.
Modello dei Dati: WeightEntry
Prima di tutto, definiamo un modello per i nostri dati. Utilizziamo una struttura chiamata WeightEntry
, che aderisce ai protocolli Identifiable
e Codable
. Questo ci permette di avere un ID univoco per ogni entry e la possibilità di codificare e decodificare i dati per la memorizzazione.
struct WeightEntry: Identifiable, Codable {
var id = UUID()
var date: Date
var weight: Double
}
ContentView
La ContentView
è il cuore dell’app. Questa view gestisce la visualizzazione dei dati, l’aggiunta di nuovi dati, e l’autenticazione dell’utente.
@State private var data: [WeightEntry] = []
@State private var currentDate = Date()
@State private var currentWeight: String = ""
@State private var weightDifference: Double = 0.0
@State private var showingForm = false
@State private var authenticated = false
data
: conserva tutte le entry del peso.currentDate
ecurrentWeight
: utilizzati per l’aggiunta di nuovi dati.weightDifference
: mostra la differenza di peso tra la prima e l’ultima entry.showingForm
: gestisce la visualizzazione del modulo per l’aggiunta di nuovi dati.authenticated
: tiene traccia dello stato di autenticazione dell’utente.
Autenticazione
Per l’autenticazione, utilizziamo la classe LocalAuthentication
. Questo viene fatto nel metodo authenticate()
, che viene chiamato quando la ContentView
viene caricata.
Salvataggio e Caricamento dei Dati
Utilizziamo UserDefaults
per salvare e caricare i dati. I metodi saveData()
e loadData()
si occupano di questa parte. Poiché il nostro modello dei dati è conforme al protocollo Codable
, possiamo facilmente codificare i nostri dati in un oggetto Data
e decodificarli.
Calcolo della Differenza di Peso
La funzione calculateWeightDifference()
calcola la differenza di peso tra la prima e l’ultima entry e la memorizza nella variabile weightDifference
.
EditView
Questa view è responsabile della modifica delle entry esistenti. Riceve un WeightEntry
e una closure updateAction
da ContentView
, che viene chiamata quando l’utente modifica i dati.
L’app, in sintesi, è un esempio di come si possono utilizzare le potenti funzionalità di SwiftUI e LocalAuthentication
per creare un’applicazione utile e sicura. Le scelte progettuali, come l’utilizzo di UserDefaults
per la persistenza dei dati e l’adozione della programmazione reattiva, rendono l’app facilmente estensibile e manutenibile.