Come di consueto, assieme ad Xcode 10 (di cui puoi vedere le novità nell’articolo di Peppe), Apple alla WWDC ha ufficialmente presentato anche la nuova versione del linguaggio Swift 4.2.

Swift 4.2?

Assieme ad iOS 12, non dovrebbe essere rilasciata una major release di Swift come tutti gli altri anni?

No, quest’anno la Apple ha deciso di prendersi un po’ più di tempo e rilasciare Swift 5.0 ad inizio 2019, per poter raggiungere la stabilità delle ABI (Application Binary Interfaces).

Attualmente, Swift non è ancora “ABI Stable”, quindi tutti i file binari delle App incorporano la versione delle Swift Dynamic Libraries con la quale il codice è stato compilato (ad esempio, se hai compilato un’App usando Swift 4.1, il binario incorporerà SOLO le librarie di Swift 4.1, e così via dicendo).

Questo perché Swift non convive ancora con iOS, ma viene “definito” assieme ai file binari dell’App.

Ma veniamo a noi, e vediamo le novità del linguaggio Swift 4.2.

Nota bene: attualmente, Swift 4.2 è incluso solamente nella beta di Xcode 10, la versione finale verrà rilasciata a settembre assieme ad iOS 12. Inoltre, da qui al rilascio definitivo, alcune funzionalità potrebbero cambiare, quindi torna qui tra un paio di mesi per scoprire gli ultimi cambiamenti!

Il protocollo CaseIterable

Grazie a questo nuovo protocollo, sarà possibile rendere gli enum iterabili! Ti basterà aggiungere la conformità al protocollo CaseIterable ed il gioco sarà fatto:

enum UserRole: CaseIterable {
    case user, moderator, admin
}

Verrà generato la computed property allCases, che in questo caso restituirà un array di UserRole.

Nell’eventualità volessi personalizzare la allCases puoi ridefinirla manualmente:

enum UserRole: CaseIterable {
    case user, moderator, admin
    
    static var allCases: [UserRole] {
        return [.user, .moderator, .admin]
    }
}

Questa particolarità è utilissima quando hai un case unavailable. In questo caso il CaseIterable non riuscirà a definire la property allCases e dovrai implementarla manualmente:

enum UserRole: CaseIterable {
    case user, moderator, admin

    @available(*, unavailable)
    case specialCase
    
    static var allCases: [UserRole] {
        return [.user, .moderator, .admin]
    }
}

Le direttive #warning e #error

Sono state introdotte due nuove direttive che generano rispettivamente un warning ed un errore in fase di compilazione:

#warning("Rendere la classe Author conforme al protocollo Equatable")
#error("Cancellare questa linea di codice temporanea!")

Nuove direttive

Questo ti permetterà di eliminare o dar più forza ed importanza a quei commenti “TODO: ….”.

Nuova API per la generazione di variabili casuali

Il linguaggio Swift 4.2 introduce una nuova API nativa di Swift per la generazione di variabili casuali, migliorando la casualità dell’output rendendola veramente casuale. Basterà chiamare la proprietà random del tipo di dato da randomizzare in questo modo:

let randomInt = Int.random(in: 1...10)
let randomDouble = Double.random(in: 1...10)
let randomFloat = Float.random(in: 0...1)
let randomBool = Bool.random()

Inoltre, gli Array hanno guadagnato dei comodissimi metodi, shuffle(), shuffled() e randomElement():

var authors = ["Peppe", "Emanuele", "Matteo", "Sara", "Luca"]
// per mischiare gli elementi di un Array
authors.shuffle()
// per creare una copia mischiata di un Array
let shuffledAuthors = authors.shuffled()
// per selezionare un elemento casuale da un Array
print("Un saluto alla community di xCoding.it da " + authors.randomElement()!)

Nota che quest’ultimo metodo restituisce un opzionale, perché potrebbe essere usato su un Array vuoto.

Il metodo removeAll delle collezioni

Il metodo removeAll, introdotto per tutti i tipi di Collection, permette di rimuovere in modo efficiente gli elementi di una Collection che non soddisfino i requisiti presenti nella closure, come ad esempio:

var authors = ["Peppe", "Emanuele", "Matteo", "Sara", "Luca"]
authors.removeAll { $0.count <= 5 }
// authors ora conterrà solo le stringhe di 6 o più caratteri

Il metodo allSatisfy delle sequenze

Al contrario del metodo removeAll per le collezioni, la funzione allSatisfy restituisce una sequenza di elementi che soddisfino una determinata condizione:

var numbers = [4, 8, 15, 16, 23, 42]
let evenNumbers = numbers.allSatisfy { $0 % 2 == 0 }
// evenNumbers conterrà solo i numeri pari presenti nell'Array numbers

Ma come, questi ultimi due nuovi metodi sono inutili! Potevo fare già tutto ciò con filter 😎”
Hai ragione, ma rispetto alla funzione filter, i nuovi metodi sono ottimizzati per eseguire l’operazione molto più velocemente.

Bool.toggle()

Infine, è stato aggiunto un simpatico metodo per invertire il valore di un Bool, quindi anziché scrivere:

var isActive = false
isActive = !isActive

Potremo scrivere:

isActive.toggle()

Comodo, no?

Conclusioni

Ovviamente queste sono solo una piccola parte di tutte le modifiche apportate a Swift, quindi per vedere tutte le modifiche che Apple ha apportato a Swift 4.2, dai un’occhiata al changelog ufficiale.

Nell’eventualità mi volessi far presente altre modifiche importanti, scrivimi pure un commento in qui sotto.

Mentre se sei interessato alle novità di Xcode 10 puoi leggere questo nostro articolo e se vuoi rimanere aggiornato su tutte le novità presentate alla WWDC 2018, ti consiglio di leggere tutti gli articoli che trovi su iSpazio o sull’app che gli abbiamo sviluppato.

Buona Programmazione!