Upload
balabit
View
129
Download
6
Embed Size (px)
Citation preview
SwiftHelyzetjelentés az iOS programozás új nyelvérőlKelényi Imre [email protected]
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
Próbáld ki böngészőből• http://swiftstub.com/
• http://www.runswiftlang.com/
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
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/
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)
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
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 használhatók
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
• nil (null) értéket csakis optional típusú változók vehetnek fel
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
var name: String? = "OpenAcademy"
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”
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)
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 } } }
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
}
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)
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)
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 konstanslet 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:")
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/
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/
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)
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
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...>Időbe telik fejben átállni a Swift szemléletre
(optional, funkcionális programozás, stb.)
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
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
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
Á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
Köszönöm a figyelmet!Kelényi Imre [email protected]