e g a u Lang
e l p p ” A C e – h t t f t i u
Sw
ho t i w C e v i t c e j ift “Ob w S e l pp
aA e n o i z 4 Introdurea Barbieri Data: 10-07-1 Di Andola: 713934 Matric
La Storia !
Nel 2010 Chris Lattner inizia a sviluppare Swift
! Swift prende spunto dai alcuni dei più diffusi linguaggi di programmazione con ObjectiveC, Rust, Haskell, Ruby, Python, C … ! Il 2 Giugno del 2014 viene presentato agli sviluppatori al WWDC !
Viene rilasciato in Beta, senza la promessa che la versione finale sia compatibile con quella finale
! Apple promette inoltre un tool di conversione del codice sorgente
Le caratteristiche ! Swift è un evoluzione di ObjectiveC con l’aggiunta di nuovi concetti e una nuova sintassi !
Elimina il delimitatori di linea ( ; ) punto e virgola
! Utilizza ARC (Automatic Reference Counting) per la gestione della memoria !
Privo di puntatori e metodi insicuri di accesso alla memoria
! Dot Notation per la chiamata dei metodi come in Java !
Fortemente tipizzato
! Case Sensitive
Variabili e Costanti !   Con Swift e’ possibile utilizzare quasi tutti i caratteri, inclusi i caratteri Unicode. !   Dichiarazione di una variabile in Swift: var đ&#x;?śđ&#x;?Ž = "dogcowâ€? !   Dichiarazione di una costante in Swift: let Ď€ = 3.14159 Le variabili/costanti non possono iniziare con un numero.
Tipizzazione !
Swift prevede la dichiarazione delle variabili prima del loro uso, inoltre è fortemente tipizzato. Il fatto di essere fortemente tipizzato indica che una variabile o una costante, possono contenere un solo tipo di dato per tutta la loro esistenza, il che significa che una variabile che contiene un intero non potrà mai contenere un numero decimale o una stringa. Dichiarare una variabile significa informare il compilatore che da un determinato punto in poi si farà riferimento ad un’area di memoria contenente uno specifico tipo di dato tramite una data etichetta. In questo modo il compilatore potrà trattare l’area di memoria e le operazioni di accesso ad essa in modo adeguato.
var languageName = "Swift” languageName = 5
// this is a compile-time error
Closures !   Le closures sono blocchi autonomi di funzioni annidate senza nome che possono essere usati come parametri di altre funzioni. Sono molto simili ai blocchi di Objective-C con alcune funzionalità extra. Sintassi: { (Parametri) -> Tipo di Ritorno in istruzioni } Esempio: sort(array,{ (num1:Int,num2:Int) -> Bool in return num1 > num2 })
Multiple Return Values ! Swift introduce la possibilità di creare funzioni con multipli valori di ritorno. ! Esempio: func count(string: String) -> (vowels: Int, consonants: Int, others: Int) { … return (vowels, consonants, others) }
Generics !   Il tipo Generics permette di scrivere codice flessibile e riutilizzabile. Tramite l’utilizzo dei generics potremmo evitare di duplicare metodi per ogni tipo di dato !
struct Stack<T> { var items = [T]() mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } }
Tuples ! Tuples e’ un tipo di dat composto da gruppi di valori in una singola variabile ! Esempio: let http404Error = (404, "Not Found”) // http404Error is of type (Int, String), and equals (404, "Not Found”)
Deinitialization ! Il metodi di deinizializzazione e’ chiamata subito prima che l’istanza di una classe venga deallocata. Basta crea il metodo deinit. La deinizializzazione è disponibile solo per le classi.
Le Classi : Esempio !
import Foundation class Persona{ var età : Int var nome:String = "” var cognome:String = "" init(name:String, surname:String, age:Int){ nome=name self.cognome=surname self.età=age } func stampaInfo(){ println("Mi chiamo "+nome+" "+cognome+" ed ho "+String(età)+" anni") } }
Il mio primo programma: println("Hello World!”) Come sempre questo tipo di programma, nella sua semplicità, racchiude in se la capacità di descrivere molte caratteristiche di base del linguaggio. Le istruzioni non hanno il ; (punto e virgola) come terminatore, ne altro terminatore se non l’a capo, sarà il compilatore a sincerarsi del punto dove termina un’istruzione e ne inizia un’altra. println è una funzione, non un’istruzione, i cui argomenti vanno specificati tra parentesi (in realtà la dichiarazione di funzioni è abbastanza complessa e sarà soggetta ad un articolo apposito). Rispetto all’Objective-C si abbandona il formato destinatario messaggio per optare direttamente per un formato più classico. Le stringhe sono comprese tra doppi apici, rispetto all’Objective-C si perde il simbolo @ che prima precedeva le stringhe costanti e che andava letto come Puntatore alla Stringa costante. Quello illustrato sopra è a tutti gli effetti un programma completo, anche se per console, non è richiesta l’inclusione di header o la definizione di funzioni particolari (come la main) o di classi specifiche. Pertanto si può affermare che Apple Swift è un linguaggio decisamente poco prolisso.
Performance
! Le performance di Swift sono superiori rispetto al “vecchio” Objective-C o ad Python.
Public, protected, private?? ! â&#x20AC;Ż Nellâ&#x20AC;&#x2122;attuale versione beta il linguaggio di Apple non presenta modificatori di accesso. ! â&#x20AC;Ż Ma dal forum ufficiale possiamo leggere che: We don't usually promise anything for the future, but in this case we are making an exception. Swift will have access control mechanisms
Apple LLVM ! La Low Level Virtual Machine (macchina virtuale di basso livello), generalmente nota come LLVM, è una infrastruttura di compilazione, scritta in C++, progettata per l'ottimizzazione di programmi in fase di compilazione, di linking, di esecuzione e di non utilizzo. ! Il compilatore just-in-time LLVM è in grado di ottimizzare parti di programma in fase di esecuzione, ed è quindi utile nei casi in cui si voglia valutare l'efficienza di una singola funzione. Grazie a questa sua particolarità, esso viene usato nella pipeline OpenGL di Mac OS X 10.5 Leopard per supportare alcune funzionalità non presenti a livello hardware.
ARC (Automatic Reference Counting) ! Introdotto da Apple nel 2011 con iOS 5 e Lion ! Nella programmazione Objective-C, Automatic Reference Counting (ARC) è un miglioramento del sistema di gestione della memoria, dove il problema di tenere traccia del reference count di un oggetto viene spostato dal programmatore al compilatore. ! Esaminando il codice, ARC è in grado di aggiungere messaggi di retain e release per deallocare o prevenire la deallocazione ! Non riesce ad evitare i Retain Cycle
ARC & Garbage Collector ! Il garbage collector è a tutti gli effetti un “processo” che analizza continuamente la memoria alla ricerca di zone che non vengono più utilizzate e che dunque possono essere deallocate. Questo ha le seguenti implicazioni: ! Il garbage collector consuma cicli di CPU. ! L’istante in cui un oggetto verrà rilasciato non è predicibile.
! ARC, invece, lavora a compile-time. In pratica, va lui stesso ad aggiungere al posto nostro le istruzioni necessarie per la gestione della memoria.
Retain cycle ! Un “retain cycle” si presenta quando due oggetti si fanno (direttamente o indirettamente) una retain a vicenda. Questo comporta un memory leak, perché entrambi gli oggetti continuerebbero a “vivere” per tutta la durata dell’applicazione anche se non venissero più utilizzati da nessun’altro.
Playground ! E’ un particolare tipo di file introdotto con XCode 6 per i progetti Apple Swift, esso permette di vedere immediatamente l’effetto delle istruzioni inserite. E’ utile per testare un pezzo di codice e vederne l’effetto. Il codice, non essendo eseguito in un ambiente sandbox (sicuro), potrebbe essere soggetto a problemi di sicurezza.
Playground Grazie a Playground potrai vedere, in tempo reale, il risultato delle istruzioni che stai scrivendo.
Sicurezza di Playground? ! â&#x20AC;Ż Playground non dispone di una barriera che lo separa dal sistema, comunemente chiamata "sandbox", e quindi ogni comando scritto in Swift può essere eseguito senza possibilitĂ di ripristino. I comandi possono essere anche potenzialmente pericolosi per il sistema come l'ordine di cancellare tutti i file dal disco!!