Novità di Swift 4

Swift 4 è stato in lavorazione negli ultimi mesi. Se sei come me, potresti seguire Swift Evolution per rimanere aggiornato su tutte le proposte e le modifiche. Anche se lo fai, ora è un buon momento per rivedere tutte le aggiunte e le modifiche alla lingua in questa nuova iterazione.

Una snapshot di Swift 4 era già disponibile poche settimane prima che Xcode 9 fosse annunciato al WWDC 2017. In questo post imparerai tutto sulle nuove funzionalità introdotte in Swift 4, dalle nuove API al miglioramento della sintassi del linguaggio.

Vediamo innanzitutto come è possibile ottenere il nuovo compilatore installato sulla macchina.

Impostazione Xcode

Esistono due modi per eseguire Swift 4. È possibile installare la versione beta di Xcode 9 se si dispone di un account sviluppatore con accesso ad esso oppure è possibile impostare Xcode 8 per l'esecuzione con un'istantanea Swift 4. Nel primo caso, scarica la versione beta dalla pagina di download dell'account sviluppatore.

Se preferisci usare Xcode 8, vai su Swift.org per scaricare l'ultima istantanea di Swift 4.0 Development. Al termine del download, doppio click per aprire il file .pkg, che installa lo snapshot. 

Passa a Xcode ora e vai a Xcode> Toolchain> Gestisci toolchain. Da lì, selezionare l'istantanea di Swift 4.0 appena installata. Riavvia Xcode e ora Swift 4 verrà utilizzato durante la compilazione del tuo progetto o del tuo parco giochi. Nota che tutto il codice presentato in questo tutorial è disponibile anche in un repository GitHub.

Nuove caratteristiche

Diamo un'occhiata alle nuove funzionalità aggiunte a Swift 4. Un avvertimento: il linguaggio è ancora in beta, e molto probabilmente vedremo più cambiamenti e correzioni di bug prima che la versione ufficiale venga rilasciata. Inoltre, alcune delle proposte approvate più di recente potrebbero non essere ancora implementate in questo momento, quindi tieni d'occhio le future note di rilascio per vedere cosa verrà implementato e risolto.

Codifica e decodifica

L'analisi di JSON è uno degli argomenti più discussi nella comunità Swift. È bello vedere che finalmente qualcuno si è occupato delle proposte di scrittura SE-0166 e SE-0167 e ha spinto l'idea di aggiornare le API di archiviazione e serializzazione nel framework Foundation. In Swift 4 non è più necessario analizzare o codificare manualmente classe, struct o enum. 

Nuovo codificabili e decodificabile sono stati aggiunti i protocolli e puoi rendere le tue classi conformi a loro semplicemente aggiungendo codificabile (che è un alias per Decodificabile e codificabile) all'elenco di ereditarietà della classe. Quindi puoi usare il JSONEncoder per codificare un'istanza della classe:

let wwdc = Conference (nome: "WWDC", città: "San Jose", data: Date (timeIntervalSince1970: 0)) lascia jsonEncoder = JSONEncoder () lascia jsonEncoded = prova jsonEncoder.encode (wwdc) lascia jsonString = String (dati: jsonEncoded, encoding: .utf8) // "name": "WWDC", "city": "San Jose", "date": - 978307200

Come puoi vedere, tu instanziati a JSONEncoder oggetto per convertire la struct in una rappresentazione stringa JSON. Ci sono alcune impostazioni che puoi modificare per ottenere il formato JSON esatto che ti serve. Ad esempio, per impostare un formato di data personalizzato, è possibile specificare a dateEncodingStrategy nel seguente modo:

let jsonEncoder = JSONEncoder () let dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long jsonEncoder.dateEncodingStrategy = JSONEncoder.DateEncodingStrategy.formatted (dateFormatter) lascia jsonEncoded = prova jsonEncoder.encode (wwdc) lascia jsonString = String (dati: jsonEncoded, encoding: .utf8) // "nome": "WWDC", "città": "San Jose", "data": "1 gennaio 1970 alle 1:00:00 GMT + 1" 

Il processo inverso per decodificare una stringa funziona in modo molto simile, grazie a JSONDecoder classe.

let jsonDecoder = JSONDecoder () lascia decodificatoWWDC = prova jsonDecoder.decode (Conference.self, da: jsonEncoded) // 'decodedWWDC' è già di tipo Conference!

Come puoi vedere, passando il tipo dell'oggetto a decodificare metodo, permettiamo al decodificatore di sapere quale oggetto ci aspettiamo dai dati JSON. Se tutto ha successo, otterremo un'istanza del nostro oggetto modello pronta per essere utilizzata.

Non è nemmeno tutta la potenza e la modularità della nuova API. Invece di usare a JSONEncoder, puoi usare il nuovo PropertyListEncoder e PropertyListDecoder nel caso sia necessario memorizzare i dati in un file plist. Puoi anche creare il tuo codificatore e decodificatore personalizzato. Hai solo bisogno di rendere il tuo decoder conforme al decoder e il tuo codificatore al Codificatore protocollo.

stringhe

Come parte del Manifesto delle corde, il Stringa anche il tipo ha ricevuto un grande aggiornamento. Ora si conforma ancora una volta (dopo essere stato rimosso in Swift 2) al Collezione protocollo grazie alla proposta SE-0163. Quindi ora puoi semplicemente enumerare su una stringa per ottenere tutti i caratteri.

let text: String = "Ciao da Tutsplus!" per carattere in text.reversed () print (character)

substring è un nuovo tipo conforme allo stesso StringProtocol a cui Stringa anche conforme. Puoi creare un nuovo substring semplicemente facendo un abbonamento a Stringa. La seguente riga crea a substring omettendo il primo e l'ultimo carattere.

let substring = text [text.index (after: text.startIndex) ... 

Una bella aggiunta che dovrebbe rendere più facile lavorare con grandi pezzi di testo è stringhe multi-linea. Se devi creare un blocco di testo che si estende su più righe, in precedenza hai dovuto inserire manualmente \ n dappertutto. Questo era molto poco elegante e difficile da gestire. Ora esiste un modo migliore per scrivere stringhe multi-linea, come puoi vedere dal seguente esempio:

let welcomeMessage = "" "Ehilà, Benvenuto su Envato Tuts +. Speriamo che ti piaccia imparare con noi!" ""

Ci sono poche regole che accompagnano questa nuova sintassi. Ogni stringa inizia con una virgola tripla ("""). Quindi, se l'intera stringa è rientrata, la spaziatura dei caratteri di chiusura decide la spaziatura da rimuovere da ogni riga nella stringa. Ad esempio, se il carattere di chiusura è rientrato da 2 schede, lo stesso importo verrà rimosso da ogni riga. Se la stringa ha una linea che non ha questa quantità di spaziatura, il compilatore genererà un errore.

Percorsi chiave

I percorsi chiave sono stati aggiunti in Swift 3 per semplificare il riferimento alle proprietà in un oggetto. Invece di fare riferimento a una chiave oggetto con una semplice stringa letterale, i percorsi chiave consentono di applicare un controllo in fase di compilazione per verificare che un tipo contenga la chiave richiesta, eliminando un tipo comune di errore di runtime. 

I percorsi chiave sono stati una bella aggiunta a Swift 3, ma il loro uso era limitato a NSObjects e non hanno giocato davvero bene con le strutture. Queste erano le principali motivazioni alla base della proposta SE-0161 per fornire all'API un aggiornamento.

Una nuova sintassi è stata concordata dalla comunità per specificare un percorso chiave: il percorso è scritto a partire da a \. Sembra il seguente:

struct Conference var name = "" let city: String let nameKeyPath = \ Conference.name let wwdc = Conference (nome: "WWDC", città: "San Jose") wwdc [keyPath: nameKeyPath] // "WWDC"

Il nameKeyPath oggetto descrive un riferimento al nome proprietà. Può quindi essere usato come pedice su quell'oggetto.

Se si modifica la variabile da permettere a var di WWDC, puoi anche modificare una proprietà specifica tramite la sintassi del pedice del percorso-chiave.

wwdc [keyPath: nameKeyPath] = "AltConf" let name = wwdc [keyPath: nameKeyPath] // "AltConf"

Gamme unilaterali

SE-0172 ha proposto di aggiungere nuovi operatori di prefissi e suffissi per evitare di ripetere inutilmente un indice di inizio o di fine quando può essere dedotto. Ad esempio, se si desidera sottoporre a pedice un array dal secondo indice fino all'ultimo, è possibile scriverlo nel seguente modo:

let numbers = [-2, -1, 0, 1, 2] let positivo = numeri [2 ... 

In precedenza, il endIndex doveva essere specificato Ora esiste una sintassi più breve:

lasciare positivo = numeri [2 ...]

Oppure, se vuoi iniziare con l'indice di partenza:

let negative = numbers [... 1]

La stessa sintassi può anche essere utilizzata per la corrispondenza del modello in a interruttore dichiarazione.

Abbonati generici

Prima di Swift 4, gli abbonati erano tenuti a definire un tipo di valore di ritorno specifico. SE-0148 ha proposto la possibilità di definire un singolo indice generico che inferirebbe il tipo di ritorno in base al valore del risultato definito. A parte l'annotazione del tipo, funziona più o meno allo stesso modo di prima.

struct Conferences let conferences: [String: Any] // Restituisce i modelli di conferenza data la sua chiave. deponente(chiave: stringa) -> T? ritorno conferenze [chiave] come? T // Definisce il tipo di ritorno della variabile e accede all'oggetto tramite subscript. let cosa: conferenza? = conferenze ["WWDC"]

Come puoi vedere, questo migliora la leggibilità dei tuoi oggetti nei casi in cui è necessario accedervi tramite la sintassi del pedice.

Esistenze di classe e sottotipo

Una delle funzionalità mancanti del sistema di tipo Swift fino ad oggi è stata la possibilità di vincolare una classe a un protocollo specifico. Questo è stato risolto in Swift 4: ora è possibile specificare il tipo di oggetto e i protocolli a cui deve conformarsi, grazie a SE-0156. Ad esempio, puoi scrivere un metodo che richiede a UIView che è conforme al ricaricabile protocollo con la seguente sintassi:

func reload (view: UIView & Reloadable) 

Dizionario e imposta miglioramenti

Dizionario e Impostato anche ricevuto un bel aggiornamento in Swift 4. Sono molto più piacevoli da usare grazie ad alcuni metodi di utilità che sono stati aggiunti.

mapValues

Il dizionario ora ha un mapValues metodo per cambiare tutti i valori, evitando l'uso del generico carta geografica metodo che richiede il lavoro con tuple chiave di valore.

let conferences = ["WWDC": "Molto buono", "AltConf": "Buono", "Firebase Party": "Molto divertente"] // Mappa su tutti i valori nel dizionario. let newConferences = conferences.mapValues ​​valore in valore restituito + "👍"

filtro Tipo di reso

Il filtro il metodo restituisce ora un oggetto dello stesso tipo con cui stai filtrando.

// Il tipo di questa variabile è [String: String] let wwdc = conferences.filter $ 0.key == "WWDC"

Predefiniti per la ricerca del dizionario

Quando si lavora con i dizionari, è possibile fornire un valore predefinito quando si utilizza la sintassi del pedice per evitare di dover decomprimere in seguito un'opzione facoltativa.

// Valore predefinito se la chiave non viene trovata. let talkShow = conferenze ["The Talk Show", default: "🤷♂️"]

Dizionario Inizializzatore di raggruppamento

Infine, a Dizionario (raggruppamento :) l'inizializzatore è stato introdotto per facilitare la creazione di un nuovo dizionario raggruppando gli elementi di una raccolta esistente secondo alcuni criteri. 

Nei seguenti esempi, creiamo un dizionario raggruppando tutti conferenze che hanno la stessa lettera iniziale. Il dizionario avrà una chiave per ogni lettera iniziale nel conferenze collezione, con ogni valore costituito da tutte le chiavi che iniziano con quella lettera.  

let dictionary = Dizionario (grouping: conferences.values) $ 0.uppercased (). first! 

risorse

Se sei interessato ad approfondire le nuove funzionalità di Swift 4, ecco alcune altre risorse:

  • Novità di Swift - Session 402 - WWDC 2017
  • Apple Swift Guide
  • Ole Begemann's What's New in Swift 4 Playground
  • Guida alla migrazione di Swift 4

Conclusione

Ora che hai dato un'occhiata ad alcune delle principali nuove funzionalità di Swift 4, probabilmente stai iniziando a utilizzarle per mantenere la base di codici fresca e pulita. Inizia a scrivere il tuo nuovo codice per sfruttare le nuove utili funzioni e pensa a rifare il codice precedente per renderlo più semplice e facile da leggere.

Impara Swift

Abbiamo creato una guida completa per aiutarti a imparare Swift, sia che tu stia appena iniziando con le basi o che desideri esplorare argomenti più avanzati.

Puoi anche controllare alcuni dei nostri altri post sullo sviluppo di app per iOS!