Swift -Helyzetjelentés az iOS programozás új nyelvéről

28
Swift Helyzetjelentés az iOS programozás új nyelvéről Kelényi Imre [email protected]

Transcript of Swift -Helyzetjelentés az iOS programozás új nyelvéről

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/

Swift fordító?Clang fordító (frontend)

Gépi kód

Optimalizálás

Swift fordító

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]