SlideShare uma empresa Scribd logo
1 de 28
Swift
Helyzetjelentés az iOS programozás új
nyelvéről
Kelényi Imre
imre.kelenyi@aut.bme.hu
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ó?
LLVM
C C++ Objective-C
ARM64 ARMv7 X86
Clang fordító (frontend)
Swift
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
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
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
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
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:")
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...
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
imre.kelenyi@aut.bme.hu

Mais conteúdo relacionado

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

LESS, mint css preprocessor
LESS, mint css preprocessorLESS, mint css preprocessor
LESS, mint css preprocessorLevente Kiraly
 
BME - Szakdolgozat (2014)
BME - Szakdolgozat (2014)BME - Szakdolgozat (2014)
BME - Szakdolgozat (2014)Csaba Szabó
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenKrisztián Gyula Tóth
 
BlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésBlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésOpen Academy
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Open Academy
 
Laravel4 - Jövő a jelenben
Laravel4 - Jövő a jelenbenLaravel4 - Jövő a jelenben
Laravel4 - Jövő a jelenbenBorsos Zoltán
 
Couchdb - WebKonf 2009
Couchdb - WebKonf 2009Couchdb - WebKonf 2009
Couchdb - WebKonf 2009Balint Erdi
 

Semelhante a Swift -Helyzetjelentés az iOS programozás új nyelvéről (7)

LESS, mint css preprocessor
LESS, mint css preprocessorLESS, mint css preprocessor
LESS, mint css preprocessor
 
BME - Szakdolgozat (2014)
BME - Szakdolgozat (2014)BME - Szakdolgozat (2014)
BME - Szakdolgozat (2014)
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
 
BlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésBlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztés
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
 
Laravel4 - Jövő a jelenben
Laravel4 - Jövő a jelenbenLaravel4 - Jövő a jelenben
Laravel4 - Jövő a jelenben
 
Couchdb - WebKonf 2009
Couchdb - WebKonf 2009Couchdb - WebKonf 2009
Couchdb - WebKonf 2009
 

Mais de BalaBit

SCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big DataSCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big DataBalaBit
 
NIAS 2015 - The value add of open source for innovation
NIAS 2015 - The value add of open source for innovationNIAS 2015 - The value add of open source for innovation
NIAS 2015 - The value add of open source for innovationBalaBit
 
Les Assises 2015 - Why people are the most important aspect of IT security?
Les Assises 2015 - Why people are the most important aspect of IT security?Les Assises 2015 - Why people are the most important aspect of IT security?
Les Assises 2015 - Why people are the most important aspect of IT security?BalaBit
 
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...2015. Libre Software Meeting - syslog-ng: from log collection to processing a...
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...BalaBit
 
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...BalaBit
 
syslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extractionsyslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extractionBalaBit
 
eCSI - The Agile IT security
eCSI - The Agile IT securityeCSI - The Agile IT security
eCSI - The Agile IT securityBalaBit
 
Top 10 reasons to monitor privileged users
Top 10 reasons to monitor privileged usersTop 10 reasons to monitor privileged users
Top 10 reasons to monitor privileged usersBalaBit
 
Hogyan maradj egészséges irodai munka mellett?
Hogyan maradj egészséges irodai munka mellett?Hogyan maradj egészséges irodai munka mellett?
Hogyan maradj egészséges irodai munka mellett?BalaBit
 
Regulatory compliance and system logging
Regulatory compliance and system loggingRegulatory compliance and system logging
Regulatory compliance and system loggingBalaBit
 
Kontrolle und revisionssichere Auditierung privilegierter IT-Zugriffe
Kontrolle und revisionssichere Auditierung privilegierter IT-ZugriffeKontrolle und revisionssichere Auditierung privilegierter IT-Zugriffe
Kontrolle und revisionssichere Auditierung privilegierter IT-ZugriffeBalaBit
 
Techreggeli - Logmenedzsment
Techreggeli - LogmenedzsmentTechreggeli - Logmenedzsment
Techreggeli - LogmenedzsmentBalaBit
 
State of the art logging
State of the art loggingState of the art logging
State of the art loggingBalaBit
 
Why proper logging is important
Why proper logging is importantWhy proper logging is important
Why proper logging is importantBalaBit
 
Balabit Company Overview
Balabit Company OverviewBalabit Company Overview
Balabit Company OverviewBalaBit
 
BalaBit IT Security cégismertető prezentációja
BalaBit IT Security cégismertető prezentációjaBalaBit IT Security cégismertető prezentációja
BalaBit IT Security cégismertető prezentációjaBalaBit
 
The Future of Electro Car
The Future of Electro CarThe Future of Electro Car
The Future of Electro CarBalaBit
 
Compliance needs transparency
Compliance needs transparencyCompliance needs transparency
Compliance needs transparencyBalaBit
 

Mais de BalaBit (18)

SCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big DataSCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big Data
 
NIAS 2015 - The value add of open source for innovation
NIAS 2015 - The value add of open source for innovationNIAS 2015 - The value add of open source for innovation
NIAS 2015 - The value add of open source for innovation
 
Les Assises 2015 - Why people are the most important aspect of IT security?
Les Assises 2015 - Why people are the most important aspect of IT security?Les Assises 2015 - Why people are the most important aspect of IT security?
Les Assises 2015 - Why people are the most important aspect of IT security?
 
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...2015. Libre Software Meeting - syslog-ng: from log collection to processing a...
2015. Libre Software Meeting - syslog-ng: from log collection to processing a...
 
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
 
syslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extractionsyslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extraction
 
eCSI - The Agile IT security
eCSI - The Agile IT securityeCSI - The Agile IT security
eCSI - The Agile IT security
 
Top 10 reasons to monitor privileged users
Top 10 reasons to monitor privileged usersTop 10 reasons to monitor privileged users
Top 10 reasons to monitor privileged users
 
Hogyan maradj egészséges irodai munka mellett?
Hogyan maradj egészséges irodai munka mellett?Hogyan maradj egészséges irodai munka mellett?
Hogyan maradj egészséges irodai munka mellett?
 
Regulatory compliance and system logging
Regulatory compliance and system loggingRegulatory compliance and system logging
Regulatory compliance and system logging
 
Kontrolle und revisionssichere Auditierung privilegierter IT-Zugriffe
Kontrolle und revisionssichere Auditierung privilegierter IT-ZugriffeKontrolle und revisionssichere Auditierung privilegierter IT-Zugriffe
Kontrolle und revisionssichere Auditierung privilegierter IT-Zugriffe
 
Techreggeli - Logmenedzsment
Techreggeli - LogmenedzsmentTechreggeli - Logmenedzsment
Techreggeli - Logmenedzsment
 
State of the art logging
State of the art loggingState of the art logging
State of the art logging
 
Why proper logging is important
Why proper logging is importantWhy proper logging is important
Why proper logging is important
 
Balabit Company Overview
Balabit Company OverviewBalabit Company Overview
Balabit Company Overview
 
BalaBit IT Security cégismertető prezentációja
BalaBit IT Security cégismertető prezentációjaBalaBit IT Security cégismertető prezentációja
BalaBit IT Security cégismertető prezentációja
 
The Future of Electro Car
The Future of Electro CarThe Future of Electro Car
The Future of Electro Car
 
Compliance needs transparency
Compliance needs transparencyCompliance needs transparency
Compliance needs transparency
 

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

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

Notas do Editor

  1. 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
  2. http://www.jessesquires.com/apples-to-apples-part-two/