2. Swift dióhéjban
• iOS/OS X fejlesztés új nyelve
• Script nyelv szerű szintaxis (~JavaScript, Ruby), de
sokkal “biztonságosabb”, modern nyelvi lehetőségekkel
• Natív kódra fordul
> Mint C, C++ vagy Objective-C
• Sok más nyelvből merít: Python, Haskell, Ruby, C#
> Objective-C without the C
• Könnyen összekapcsolható Objective-C-ben írt kóddal
(interoperability)
• Elsőre egyszerűnek tűnik, de sok funkciója kifejezetten
komplex és ezek helyes elsajátítása nem kevés időt
igényel
4. Swift fordító?
LLVM
C C++ Objective-C
ARM64 ARMv7 X86
Clang fordító (frontend)
Swift
Gépi kód
Optimalizálás
Swift fordító
5. Evolúció
• A Swift az első béták (2014 nyár) óta
rengeteget változott / fejlődött
>Teljesítmény
>Szintaxis és nyelvi elemek
• 2014. szeptember - Swift 1.0
• 2015. február - Swift 1.2
6. Kompatibilitás
• OS verziók
>iOS 7.0+
>OS X 10.9 (Mavericks)+
• Fejlesztéshez Xcode 6.0+
• Az összes standard Apple API elérhető
Swiftből
• Silver: egy Swift kompatibilis fordító .NET
CLR/Java-hoz (sajnos nem open source):
http://elementscompiler.com/elements/silver/
7. Playground ~ Swift homokozó
• Playground dokumentum
>Interaktív Swift környezet
>A kód automatikusan fordul és minden
kódsorhoz kiértékeli/kiírja az eredményét
>Tanuláshoz, kódrészletek kipróbálásához, új
osztályok prototípusának megírásához
>Rich-text dokumentáció ágyazható bele
(markdown)
8. Milyen más programozási nyelvekből
merített?
• Objective-C: Objective-C runtime, ARC
• Rust: let/var és még rengeteg más…
• Haskell: optional
• Python: n-nesek (tuples), opcionális
pontosvesszők
• C#: class: reference type, struct: value type
• Java: generics
• JavaScript: closures
9. Swift és Objective-C egy
projektben
• Alapvetően a két nyelvben írt osztályok
vegyíthetők egy projekten belül is
>Az ObjC API-k átkonvertálódnak Swift-re
- (NSString *)generateKeyWithSeed:(NSString *)seed complexity:(NSInteger)complexity;
func generateKeyWithSeed(seed: String!, complexity: Int) -> String!
>A Swift osztályok interfésze átkonvertálódik ObjC-
re, kivéve a Swift specifikus funkciókat (pl.
generics, tuples)
• 3rd party ObjC libraryk gond nélkül
10. Biztonságos kód
• Erősen és statikusan típusos
• Változókat első használat előtt kötelező
inicializálni
• var/let (mutable/immutable) változók
deklarálása
• Generics
• switch-eknek le kell fednie a teljes
értékkészletet (ellenőrzés fordításkor)
• Láthatóság szabályozása:
public/private/internal
11. Optional
• Hogyan fejezzük ki egy érték hiányát? Pl.
ObjC:
>Objektumok (pointerek): nil pointer
>Primitív típusoknál? 0? Mi történjen, ha a 0 is
megengedett érték? NSNull?
• Swift: tetszőleges típus megjelölhető
optional-ként (?) és innentől felvehet nil
értéket
>Nem csak referencia típusoknál!
>Explicit kommunikálja, hogy egy adott változónál
előfordulhat-e, hogy nincs értéke
var optionalInt: Int? = nil
12. Tömör és jól érthető kód
• Type inference
>Változók, closure-ök
• Pontosvesszők és zárójelek (legtöbb
esetben) opcionálisak
• Tömör closure (lambda) szintaxis
let someClosue: () -> Void = { println("Hello") }
• Függvényekhez híváskor kiírandó („külső”)
paraméternevek
• Sok „syntax sugar”
13. Rugalmas és bővíthető
• Metódusokkal bővíthető enum és struct
• Névterek (sajnos csak külön modulonként:
library)
• Dinamikus frameworkök
• Operator overloading
>Egyedi operátorok is megadhatók (akár
egyedi unicode karakterrel)
prefix operator +++ {}
• Már meglévő típusok (struct-tok is) utólag
bővíthetők új metódusokkal (extension)
14. Enum egyedi metódussal
• Metódusok rendelhetők szinte minden
adatszerkezethez
enum DashboardState {
case Empty
case Unpaid
mutating func toggle() {
if self == .Empty {
self = .Unpaid
}
else {
self = .Empty
}
}
}
15. Példa: SwiftyJSON
• Alap JSON parszolás rengeteg extra kód az optional ellenőrzések
miatt:
let JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(
data, options: nil, error: nil)
if let statusesArray = JSONObject as? [AnyObject],
let status = statusesArray[0] as? [String: AnyObject],
let user = status["user"] as? [String: AnyObject],
let username = user["name"] as? String {
// Végre megvan a username...
}
• SwiftyJSON library, subscript [ ] operátor felüldefiniálássaé:
let json = JSON(data: dataFromNetworking)
if let userName = json[0]["user"]["name"].string{
// Máris megvan a username
}
16. Funkcionális programozás
• A függvények, metódusok és closure-ök
(lambdák) a nyelv elsőrendű elemei
>Lehetnek visszatérési érték, paraméterként
átadhatók, stb.
• Swift standard library: map, filter, reduce
let numbers = [1, 3, -5, 7, -9]
let negativeNumbers = numbers.filter { $0 < 0 }
• Ettől még a Swift nem egy funkcionális
programozási nyelv (csak tartalmaz
funkcionális programozást támogató
konstrukciókat)
17. Hátrányok? 1/2
• Kevésbbé dinamikus mint ObjC (pl. nincs
method swizzling, bizonyos trükköket nem
lehet vagy nehezebb megcsinálni)
>Pl. nincs Swiftben írt unit tesztelésnél
használható Mock/Stubbing (test double)
könyvtár
• Sok API-nál vissza kell nyúlni az
ObjC/Foundation osztályokhoz (pl.
NSString osztály vs. Swift String osztály)
18. Hátrányok? 2/2
• let (konstans) eltérő viselkedés struct/class
esetén
>struct (érték típus): valódi konstans (immutable)
let str = "Hello" // String struct -> valódi konstans
>class (referencia típus): csak a referencia
konstans
let obj = NSObject() // csak a referencia konstans,
// obj mutable
• Elsőre furcsa (inkonzisztens) függvény
paraméterezés
• Selector kezelés sztringekkel (futási időben
ellenőrzi)
Selector("methodNameThatYouWillSurelyMistype:")
19. Open source Swift?
• Apple-től nem valószínű...
>Bár az Objective-C runtime open source, sosem
volt magas prioritással kezelve az Apple-nél
>Apple-nek valószínűleg nem érdeke, hogy
megjelenjen más platformokon
>4 évig teljesen titokban tartották
• Hátha mégis?
>llvm/clan-re épül, ami open source...
>Silver: egy Swift kompatibilis fordító .NET
CLR/Java-hoz (sajnos nem open source):
http://elementscompiler.com/elements/silver/
20. Swift teljesítmény
• Általánosságban: gyors, az Objective-C-vel
összemérhető teljesítmény
• 3 Geekbench teszt átírva Swift-re: 10%-on
belüli eltérés a C++ implementációhoz
képest
>http://www.primatelabs.com/blog/2015/02/swift-
performance-updated/
• JSON feldolgozás, tömb műveletek, GPS
koordináták feldolgozása:
>ObjC adatszerkezetek még gyorsabbak, de nem
vészes
>http://blog.sudeium.com/2015/02/10/swift-1-dot-2-
performance-pretty-much-fine/
21. Xcode (IDE) teljesítmény
• Xcode 6.3-ra sokat javult, de még mindig a legnagyobb
probléma
> Crash-ek, lefagyások
> Indexálás/code completion anomáliák
> Nagy projekteknél code completion/indexing borzasztóan
belassul
> Fordító jóval lassabb mint ObjC-nél
> Fordító néha rosszul/máshol jelzi a hibákat a kódban (különösen
closure-öknél)
> „Gyilkos kódrészletek”: kifagy tőle az IDE, néha az egész gép és
nehéz megtalálni a hibás részt (egyre kevésbé probléma)
22. Objective-C?
• Apple: „az Objective-C teljesértékű iOS
programozási nyelv marad”
>Meddig?
• Jelenleg még nagyon fontos az ObjC tudás
(rengeteg legacy kód, library ObjC-ben)
>Olvasási/megértési szinten tisztán Swift-ben
írt projekteknél se árt
• A fejlesztői közösségben nagy a Swift
sikere
>Rengeteg csak Swiftet támogató új library
23. Saját projekttapasztalatok
• 2 teljesen Swiftben írt alkalmazás
• Az Xcode időben elveszi amit a tömör
szintaxissal nyerünk...
• Néhány megmagyarázhatatlan
memory
leak és crash ObjC és Swift
keverésekor
>Némi kísérletezéssel meg lehetett oldani
őket
• A Swift eltérő gondolkodást igényel
>Lehet „Objective-C”-s Swift kódot is írni...
24. Esettanulmány: SlideShare iOS
App 1.0
• App Store-ban elérhető, 4.5⭐-os értékelés
• 95% Swift
>ObjC: néhány library és pár speciális osztály
• Alapvetően pozitív tapasztalatok, blocking
issue nem volt
• Problémák:
>Lassú fordító és akadozó Xcode...
>Új Xcode/Swift verzióknál kód átírása
https://engineering.linkedin.com/ios/our-swift-experience-slideshare
25. Swift libraryk
• Már most nagyon sok, tisztán Swiftben írt
komponens (egy részük használható ObjC
kódból is)
• https://github.com/Wolg/awesome-swift
>A curated list of awesome Swift frameworks
• Példák:
>Alamofire: http networking
>Haneke-swift: image caching
>ios-charts: charting library
26. REPL (Read-Eval-Print Loop)
• Parancssorból vagy debuggolás közben
elérhető interaktív Swift környezet
>Terminal: xcrun swift
>Debugger (lldb): repl
• Egyszerűen injektálható kód akár futás
közben
27. Átállás Swiftre
• Új iOS fejlesztők számára jó lehetőség
> Kezdés Swift-tel és később megtanulni ObjC-t
• Új projekteknél érdemes teljesen vagy legalább
részlegesen (pl. prezentáció/UI) átállni
> Nyomás a fejlesztői közösség és az Apple részéről: előbb
utóbb úgyis
• Kockázat: Xcode, de kezelhető
• Már meglévő projekteknél csak speciális esetben
> Minden működik továbbra is Objective-C-ben
> Egyedüli hiányosság a vadonat-új, csak Swiftben, ObjC-vel
nem kompatibilis Swift library-kra való igény lehet
> Meglévő kódokat átkonvertálni felesleges
http://appleinsider.com/articles/14/06/04/apples-top-secret-swift-language-grew-from-work-to-sustain-objective-c-which-it-now-aims-to-replace
Chris Lattner