Compatibile con Xcode 8

Gestire le Date con il linguaggio Swift | Creiamo una semplice App

ENTRA NEL NOSTRO GRUPPO FACEBOOK

Per qualsiasi programmatore, quale che sia il linguaggio di programmazione utilizzato, gestire le date è uno scoglio che prima o poi va affrontato.

Sembra banale, noi lo facciamo senza neanche pensarci, la la rappresentazione delle date (inteso come i calendari, i giorni ecc) è un problema ancora attuale nella programmazione e nello sviluppo delle applicazioni.

Il conteggio del tempo non è un qualcosa di universale (se non consideriamo l’aspetto fisico), bensì dipende principalmente dalla cultura e dal contesto in cui viviamo. Solo per fare un esempio, noi italiani abbiamo una tipologia di calendario mentre i cinesi un altro. Su Marte il nostro anno non vale 365 giorni e così via.

Fortunatamente i linguaggi di programmazione moderni, come il linguaggio Swift, ovviano, ai tantissimi problemi che riguardano la gestione delle date, in maniera elegante ed intuitiva (grazie Apple!).

Per rendere il tutto più pratico possibile, ho pensato di realizzare una piccola app che, partendo dalla data di nascita, ci permetterà di calcolare la nostra età in anni, mesi, giorni od ore. Pubblicherò a breve questa app sullo Store, così oltre al codice condiviso qui, avrai a disposizione anche la app funzionante per il tuo device.

datepicker-e-calcolo-delle-date-linguaggio-swift

Se vorrai potrai scaricare il progetto in fondo alla pagina. Dato che non ci occuperemo di creare l’interfaccia, se hai dei problemi con questa parte puoi partire da i nostri tutorial più semplici o dal corso di sviluppo applicazioni iOS.

Sei pronto a gestire le Date con il linguaggio Swift? Allora cominciamo!

Il Date Picker

L’oggetto principe per la gestione delle date è il Date Picker. questo è un PickerView speciale composto da diverse rotelle che permettono, in maniera intuitiva, di selezionare la data (e l’orario).

date-picker-linguaggio-swift

Il Date Picker può essere personalizzato a piacimento, puoi vedere nell’Attribute Inspector le principali configurazioni:

  • Mode: configura la tipologia di dato che il Date Picker mostra, può assumere valore Date&Time (mostrerà a schermo sia la data che l’ora), Date (solo la data), Time (solo l’ora) e Count Down Timer (il classico conto alla rovescia). Nel nostro progetto ho impostato il mode a Date, non mi interessa in questo contesto vedere l’ora di nascita.
  • Locale: ogni nazione ha il suo modo di visualizzare le date, gli inglesi mettono davanti il mese, noi italiani il giorno, alcuni utilizzano l’ora nel formato 24h, altri nel formato 12h con AM e PM. Puoi impostare “default” per mostrare data e ora nella modalità del tuo utente, oppure selezionarla tu. Ora lasciamo default, però fai attenzione: nel simulatore, se non lo hai impostato, vedrai la modalità americana, mentre sul tuo telefono avrai probabilmente la data “all’italiana”.
  • Interval: indica l’intervallo di scorrimento minimo, in minuti. Se vuoi fare una prova, imposta mode a Time e cambia di volta in volta l’interval. Testando la app vedrai che la rotella dei minuti cambierà in funzione di questo valore.
  • Date: è la prima data che ti mostra all’apertura dell’app. Puoi impostare la data come “Current Date” ed avere la data (e anche l’ora se hai impostato Date and Time nel mode) odierna, oppure “Custom” ed impostare tu una data a tuo piacimento.
  • Minimum e Maximum Date: se flagghi, le due opzioni ti permettono di impostare un limite minimo e massimo per la data che l’utente potrà selezionare. In questo progetto ho impostato solo il Minimum Date, al 1/1/1900.
  • Timer: nel mode Count Down Timer ti permette di impostare un valore di default da cui far partire il timer (sarà sempre modificabile dall’utente manualmente).

Nel View Controller

Bene, ora che abbiamo fatto la conoscenza di Date Picker, entriamo un pò più nella pratica. Come già scritto, imposta Mode a Date, Locale a Italian, Date a Current Date, flag su Minimum Date e data minima 1/1/1900.

A questo punto crea sul View Controller una Label, piazzato subito sotto il Date Picker.

Ora colleghiamo al codice i due oggetti:

Nel ViewDidLoad impostiamo data_text uguale al valore di select_data:

Proviamo ora il primo Build & Run, vedrai che effettivamente data_text riporta la data del Date Picker… ma, a differenza di select_data, il formato data è impostato secondo le impostazioni di default (mm-dd-yyyy hh:mm:ss +dddd).

date-picker-primo-test-linguaggio-swift

Formattiamo la data

Ok, è chiaro che questo formato non è il massimo per un utente. Proviamo a renderlo più leggibile:

Il DateFormatter() è una classe del Framework Foundation, nativa per il linguaggio Swift, che gestisce la formattazione della data. Permette di trasformare dal tipo dato String al tipo dato Date, e viceversa, secondo gli standard UniCode. Se sei digiuno sugli standard UniCode, questa lettura ti può aiutare.

Per aiutarti a comprendere, comunque, questi sono i principali indicatori.

dd indica il numero del giorno del mese, inserito a 2 cifre
MM indica il numero del mese, sempre a 2 cifre
MMM indica il mese, in formato testuale, ma abbreviato (ad esempio “Gen” per Gennaio, etc.)
MMMM indica il mese, in formato testuale, lungo (“Gennaio”, “Febbraio”, etc.)
yy indica l’anno, a 2 cifre, senza la dicitura del secolo
yyyy è invece l’anno a 4 cifre

Esistono poi numerosissimi altri indicatori per ora, minuti, secondi, settimana, giorno della settimana, etc.

Tutti questi indicatori possono essere combinati, con differenti separatori (io ho usato /, ma puoi usare numerosissimi separatori, anche un semplice spazio).

Prenditi un pò di tempo per familiarizzare con questi identificatori. Modifica la proprietà DateFormat rispetto a quanto ho scritto io, e divertiti a scoprire le infinite combinazioni che puoi ottenere.

Esercizio 0. Se in grado di ottenere un risultato simile a questo? Ven, 14 Ott 2016 – 23:01.

Hai preso il tuo tempo per sperimentare? Bene,  ora possiamo procedere.

Dopo aver deciso quale è il corretto formato della data (e ora, se ti serve) che vuoi visualizzare, otteniamo la stringa che ci serve e scriviamola nella variabile convertedDate. A questo punto possiamo sovrascrivere la data già formattata nella nostra Label.

test-date-picker-linguaggio-swift

Calendar

Finora abbiamo imparato a giocare con le date. Ora siamo a metà dell’opera. Ti ricordi quale è lo scopo di questa app?

Dobbiamo ottenere, a partire dalla data di nascita, la tua età, in giorni, mesi, anni, ore… le possibilità sono infinite e sono limitate solo alla fantasia.

E’ giunto il momento di presentarti un’altra formidabile alleata: Calendar. Come Date() e DataFormatter, anche Calendar è una classe di Foundation, ed è una classe potentissima. Contiene i principali metodi per il calcolo del tempo, e sarà il nostro strumento per i prossimi passaggi.

Il primo elemento da analizzare è l’enumeratore Components.

Prima di affrontare questo argomento, ti ricordi cosa è un enumeratore? No??  Nel corso gratuito linguaggio di programmazione Swift, e in particolare in questa lezione puoi ripassare.

I components, lo dice la parola, sono i componenti della data: secondi, minuti, ore, giorni, mese e anno… giorno della settimana, settimana del mese, etc.

Facciamo un esercizio. Scomponiamo la data del Date Picker (cioè il select_data.date) in tre diverse variabili: giornodelmese, mesedellanno e anno.

Ora, utilizzando i components, alimentiamo le variabili:

Semplice, no?

Ricapitoliamo, abbiamo definito una costante calendar dall’attuale calendario del device, poi la costante components che scompone la data del Picker Date nei components di nostro gradimento (io ho utilizzato .day .month e .year, ma sono tantissimi).

Creiamo una funzione e inseriamo il codice scritto finora al suo interno:

Infine, richiama scomponiDate da ViewDidLoad, e al prossimo Build & Run avremo la nostra stringa di codice sulla consolle: “Il giorno selezionato è 14, il mese 10 e l’anno 2016”.

Aggiorniamo la data

Bene, fin qui abbiamo lavorato con una data statica, ma se il nostro obiettivo è ottenere informazioni dalla data di nascita, dobbiamo reagire al cambio della data dentro il Date Picker.

Il metodo da richiamare è ValueChanged del Date Picker: con il solito metodo CTRL + Drag crea un’action per il Date Picker (Se non ti ricordi come si fa, guarda questo tutorial):

In questa action, per il momento, è sufficiente richiamare scomponiDate per avere una app reattiva all’aggiornamento della data.

Ok, siamo a buon punto! Ora non ci manca nient’altro che fare un semplice calcolo e avremo raggiunto il nostro scopo.

Intervalli di tempo

Ottenere il calcolo degli intervalli di tempo è l’ultima cosa che impareremo oggi, esiste una funzione di Foundation che si occupa di calcolare gli intervalli… anzi, ne esistono diverse.

Noi oggi utilizzeremo timeIntervalSinceNow, per calcolare la differenza tra una data qualsiasi (noi useremo quella del Date Picker) e la data odierna.

In pratica, queste funzioni permettono di capire quanto tempo, inteso nei suoi componenti, c’è di distanza da un’altra data.

Per esempio, quanti anni di differenza ci sono tra il 1993 ed il 2016? Le funzioni di timeInterval rispondono proprio a questa domanda.

Ma oltre questa esistono anche timeIntervalSinceReferenceDate (la differenza tra la data da considerare e il 01/01/2001 00:00), timeIntervalSince1970 (questa non ha bisogno di spiegazioni, vero?) e timeIntervalSince(_:).

Quest’ultima forse è la funzione più interessante, insieme a timeIntervalSinceNow, perché ti permette di calcolare la differenza tra due date qualsiasi.

Prima di tutto otteniamo la nostra differenza di date in secondi (tutte le funzioni che ti ho menzionato riportano il risultato in secondi, il tuo risultato sarà un valore Double).

L’intervallo prende in considerazione un lasso di tempo a partire da adesso, perciò tutte le date già passate daranno un risultato negativo. Per ovviare ho moltiplicato per -1 il risultato.

Ora possiamo convertire il risultato nei valori che più ci piacciono: minuti, ore, giorni, etc.

e la conversione, altro non è che un semplice calcolo matematico:

Fatto! Con un’apposita modifica alla func scomponiData che hai creato, sei in grado di calcolare la tua età (facciamo in anni… mi fa sentire meno vecchio) in maniera semplicissima.

datepicker-e-calcolo-delle-date-linguaggio-swift

Processo inverso: dalla stringa alla data

Faccio un rapido inciso, giusto per completare la spiegazione, anche se non è funzionale al progetto che abbiamo visto finora. A volte capita di dover costruire una data partendo da una stringa.

Anche in questo caso dateFormatter ci viene incontro, sarà sufficiente utilizzare il parametro .date:

Conclusioni e Download Progetto

Ora direi che abbiamo visto davvero tutto. Gestire le date con il linguaggio Swift oramai non avrà più segreti.

Per approfondire gli studi, se già non l’hai fatto, ti suggerisco di acquistare il Corso Sviluppo Applicazioni iOS con Swift. In Alternativa da un’occhiata ai nostri tutorial gratuiti.

Buona programmazione!

Changelog

  • 17/10/2016 – Articolo pubblicato

  • Marco Romano

    Ottimo tutorial Gianvittorio!! ;)

    • Viktor Max

      Grazie mille! Visto che è un argomento che ha suscitato parecchie difficoltà, abbiamo pensato fosse utile…

Start typing and press Enter to search