2. CHI SONO?LELIO CAMPANILE
WORK AT UNICAMPANIA.IT (EX UNINA2)
TEACHER AT APPLE FOUNDATION COURSE FOR UNICAMPANIA
FOLLOW ME ON TWITTER: @LELIOC
LELIO.CAMPANILE@GMAIL.COM
WWW.LELIOCAMPANILE.IT
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
3. PERCHÉ SWIFT?
> serviva un linguaggio più sempice e più
moderno di objective-c
> abbassare la soglia di apprendimento per i
nuovi programmatori
> compatibilità con le librerie esistenti in
objective-c
> usa lo stesso compilatore di objective-c
(LLVM in xcode)
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
4. LA NASCITA DI SWIFT
> inizio sviluppo nel 2010
> viene presentato al WWDC 2014 (giugno 2014)
> 15 settembre 2014 viene rilasciato Swift 1.0 con
Xcode 6
> swift 2.0 viene annunciato al WWDC 2015
> 15 settembre 2015 viene rilasciato swift 2.0
con Xcode 7
> swift 3.0 viene presentato al WWDC 2016
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
5. SWIFT E L'OPEN SOURCE
> Apple al WWDC 2015 dichiara che swift sarà
open source
> 3 dicembre del 2015 swift è Open source
> licenza Apache 2.0
> www.swift.org
> sorgenti su github https://github.com/
apple/swift
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
13. UN PICCOLO VIAGGIO NELLA SINTASSI
swift è riuscito ad abbandonare l'obbligo del
punto e virgole alla fine delle istruzioni, che
è opzionale.
Per le {} ancora non ci siamo!
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
14. I COMMENTI
// Commenti singola linea
/* Commenti su più linee
in stile C
*/
# Python commenti singola linea
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
15. LE VARIABILI: PYTHON WAY...
> python è un linguaggio fortemente, ma
dinamicamente tipizzato
> non è necessario dichiarare espicitamente i tipi
> tutto, anche i tipi base sono oggetti!
> Non esistono le costanti
nome = "lelio"
x = 10
nome = 20
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
16. ... SWIFT SIDE
> swift è fortemente tipizzato
> tutte le variabili devono essere dichiarate
prima di essere utilizzate
> il compilatore è in grado di "indovinare" il
tipo che si assegna alla variabile
var nome = "lelio" // tipo "indovinato dal compilatore"
var altronome: String = "lorenzo" // tipo dichiarato esplicitamente
var x: Int = 10
let costante: Int = 20
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
17. TYPE INFERENCE
PYTHON
nome = "lelio"
nome = 12 #funziona!!
# in python viene creato l'oggetto "lelio" o 12 e
# poi asseganto alla variabile
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
18. TYPE INFERENCE
SWIFT
var nome = "lelio"
var nome = 10 // errore!!!
// swift è fortemente e staticamente tipizzato
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
19. LA GESTIONE DELLA MEMORIA
> Sia swift che python hanno la gestione
automatica della memora
> Si occupano da soli di allocare e deallocare
la memoria
> Usano entrambi il reference counting (ARC
Automatic Reference Counting)
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
20. REFERENCE COUNTING
> il gestore della memoria aumenta un
contatore ogni volta che un oggetto viene
referenziato
> quando uno oggetto viene dereferenziato il
contatore viene decrementato
> quando il contatore è a 0 si è sicuri che non
c'è nessun riferimento e l'oggetto può
essere cancellato
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
21. REFERENCE CYCLE
Quindi con il reference counting è tutto rose
e fiori??
NO, OVVIAMENTE
Il problema si chiama reference cycle: non c'è
nessun riferimento ad un oggetto, ma il suo
contatore non è 0
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
22. IN PYTHON ESISTE IL GARBAGE
COLLECTOR
# Esempio di reference cycle
def reference_cycle():
a = []
a.append(a)
reference_cycle()
Il garbage collector viene invocato quando il
numero di allocazioni in memoria - il numero di
deallocazione è minore di un valore soglia
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
23. ARRAY (OVVERO LISTE)
# python
numeri = [1,21,22,71]
foo = [1,2, True, "ciao", "array"]
foo[0] # 1
# possono essere eterogenee
// swift
var numeri = [1,21,22,71] // int array
var frutta = ["pere", "arancie", "mele"] // string array
// devono essere omogenee
frutta[0] // pere
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
24. DIZIONARI
# Python
d = dict(nome = "lelio", sesso = "M")
d = {"nome": "lelio", "sesso" = "M"}
nome = d["nome"]
d["prov"] = "Napoli" # aggiungi un elemento
del d["prov"] #rimuove un elemento
// Swift
var dict = Dictionary<String, String>()
var d = ["nome": "lelio", "sesso": "M"]
var nome = d2["nome"]
d2["prov"] = "Napoli" // aggiunge un elemento
d2.removeValue(forKey: "prov") // rimuove un elemento
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
25. CICLI
# Python
for n in numeri:
print(n)
// Swift
for n in numeri{
print(n)
}
SI ASSOMIGLIANO, VERO?
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
26. CONDIZIONI
# Python
x = 10
y = 5
if x > y:
print("x è il valore maggiore")
elif x == y:
print("x e y sono uguali")
else:
print("y è il valore maggiore")
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
27. CONDIZIONI
//Swift
var x = 10
var y = 5
if x > y {
print("x è il valore maggiore")
}
else if x == y {
print("x e y sono uguali")
}
else {
print("y è il valore maggiore")
}
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
28. LIST COMPREHENSIONS
QUALCOSA DI PIÙ COMPLICATO...
# Python
q = []
for x in range(10):
q.append(x**2)
q = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
q2 = [x**2 for x in range(10)]
q2 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
29. LIST COMPREHENSIONS
// Swift
var q = [Int]()
for x in 0..<10 {
q.append(x*x)
}
q = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
var values = Array(0..<10)
let q2 = values.map {$0 * $0}
q2 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
30. ...E LE PERFORMANCE
In python:
python -m timeit -s "q = [x**2 for
x in range(10)]"
0.0161 usec per loop
python -m timeit -s "q = []" "for
x in range(10):" " q.append(x**2)"
1.69 usec per loop
In swift: sono equivalenti
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
31. LE FUNZIONI
# Python
def ciao(persona):
salutiamo = "Ciao " + persona
return salutiamo
print(ciao("lelio")) # Ciao lelio
// Swift
func ciao(persona: String) -> String {
let salutiamo = "ciao " + persona
return salutiamo
}
print(ciao(persona: "lelio")) // ciao lelio
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
32. CLASSI
# Python
class Esempio:
def __init__(self,a ,b):
self.a = a
self.b = b
e = Esempio(1, 2)
print(e.a) # 1
print(e.b) # 2
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
33. CLASSI
// Swift
class Esempio {
var a = 0
var b = 0
init(_ a: Int, _ b: Int) {
self.a = a
self.b = b
}
}
let e = Esempio(1, 2)
print(e.a) // 1
print(e.b) // 2
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com
34. LE CLASSI E LE STRUCT IN SWIFT
in swift oltre le classi esistono (e sono anche molto utilizzate)
le struct
Cosa sono le struct?? Sono un modo di defnire un tipo di dato!
In pratica le classi e le struct si somigliano molto, si definiscono
molto similmente, entrambi possono avere metodi ed attributi...
In cosa differiscono:
1. le scruct non supportano l'ereditarietà
2. le struct sono sempre passate per valore
3. le classi sono sempre passate per riferimento
Lelio Campanile per Pycon Otto @lelioc lelio.campanile@gmail.com