Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

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

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

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

  1. 1. Swift Helyzetjelentés az iOS programozás új nyelvéről Kelényi Imre imre.kelenyi@aut.bme.hu
  2. 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
  3. 3. Próbáld ki böngészőből • http://swiftstub.com/ • http://www.runswiftlang.com/
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  28. 28. Köszönöm a figyelmet! Kelényi Imre imre.kelenyi@aut.bme.hu

×