Současné trendy vývoje aplikací pro platformu iOS Petr Zvoníček @zvonicek 27. 11. 2014 PV226 Proč je vývoj pro iOS zajímavý? • uzavřený ekosystém • silná open source komunita • roční vývojový cyklus major verzí • rychlá adopce nových verzí OS Osnova • Historické kořeny iOS • Proměny programování pro iOS • Swift iOS “iPhone runs OS X! Why would we want to run such a sophisticated OS on a mobile device? It's got everything we need. Multitasking, networking, power management, security, video, graphics, audio, core animation.” Steve Jobs, 2007 NeXTSTEP • Unix-like OS vyvynutý společností NeXT roku 1989 • Přímý předchůdce OS X a iOS • Vývoj aplikací: jazyk Objective-C a NeXT API (Cocoa Framework) • Firma NeXT v roce 1997 koupena Applem Objective-C • objektově orientovaný jazyk, představen r. 1983 • výrazná popularizace až s NeXT, OS X a iOS • rozšíření jazyka C o OOP • OOP založeno na zasílání zpráv (na rozdíl od volání metod u C++) po vzoru Smalltalku • třída – 2 soubory (class.m a class.h) C++: obj->method(argument); Objective-C: [obj method:argument]; C++: int method (int i)
 {
 return square_root(i);
 } Objective-C: - (int)method:(int)i
 {
 return [self square_root:i];
 } iPhone OS • dědictví z NeXTstep a OS X • Darwin (BSD-like základ NeXTstep a OS X) • Objective-C • Cocoa Framework • Xcode + Interface Builder • memory management Počátky • Leden 2007 – představení iPhone a iPhone OS 1.0 • Červen 2008 – iPhone OS 2.0, App Store • Červen 2009 – iPhone OS 3.0 • Červen 2010 – iOS 4.0 • … • Červen 2014 – iOS 8.0 Automatic Reference Counting • alternativa ke garbage collectoru • založen na statické analýze kódu a udržování počtu referencí na instanci • deterministický • uvolnění paměti zajišťuje Apple LLVM kompilátor • problém retain cyklů zdroj: developer.apple.com zdroj: developer.apple.com zdroj: developer.apple.com zdroj: developer.apple.com zdroj: developer.apple.com Storyboarding • Návrh UI formou flow chartu • Snadný prototyping • Přizpůsobení rozhraní pro zařízení iPhone a iPad iOS 7 iOS 8 • App Extensions • Action • Today • Keyboard • Handoff Swift • multi-paradigmatický jazyk • inspirován jazyky Objective-C, Rust, Haskell, Ruby, Python, C# • Snaha eliminovat programátorské chyby • Moderní prvky: generics, closures, type inference • Funkcionální prvky (map, reduce, filter, …) • Rychlejší než Objective-C Variables var languageName: String = "Swift" Constants let languageName: String = "Swift" Type inferrence let languageName = "Swift" // String let introduced = 2014 // Int let isAwesome = true // Bool Unicode names let 🐶🐮 = "dogcow" Arrays and dictionaries var names = ["Anna", "Alex", "Brian", “Jack"] var numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4] Optionals let numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4] let possibleLegCount: Int? = numberOfLegs["aardvark"] if possibleLegCount == nil { println("Aardvark wasn't found") } else { let legCount = possibleLegCount! println("An aardvark has \(legCount) legs") } let numberOfLegs = ["ant": 6, "snake": 0, "cheetah": 4] let possibleLegCount: Int? = numberOfLegs["aardvark"] if let legCount = possibleLegCount { println("An aardvark has \(legCount) legs") } Optionals Functions func buildGreeting(name: String = "World") -> String { return "Hello " + name } let greeting: String = buildGreeting() Closures let greetingPrinter: () -> () = { println("Hello World!") } greetingPrinter() //Hello world Closures as Parameters func repeat(count: Int, task: () -> ()) { for i in 0..count { task() } } repeat(2, { println("Hello!") }) Trailing closures func repeat(count: Int, task: () -> ()) { for i in 0..count { task() } } repeat(2) { println("Hello!") } Closures struct Array { func sort(order: (String, String) -> Bool) } clients.sort({(a: String, b: String) -> Bool in return a < b }) Closures struct Array { func sort(order: (String, String) -> Bool) } clients.sort({ a, b in return a < b }) Closures struct Array { func sort(order: (String, String) -> Bool) } clients.sort({ $0 < $1 }) Properties class Vehicle { var description: String { get { return "Speed: \(speed)" } set { } } var speed: Double = 0.0 { willSet { if newValue > 90.0 { println("Careful now.") } } } } Structures struct Rect { var width: Double var height: Double var area: Double { return width * height } func isBiggerThanRect(other: Rect) -> Bool { return self.area > other.area } } Generics struct Stack { var elements = [T]() mutating func push(element: T) { elements.append(element) } mutating func pop() -> T { return elements.removeLast() } } var intStack = Stack() intStack.push(50) let lastIn = intStack.pop() Spolupráce mezi Swiftem a Objective-C • Problém • Systémové frameworky napsány v Objective-C (Cocoa) • externí knihovny, legacy kód • Řešení • Objective-C -> Swift – ručně: bridging header • Swift -> Objective-C – automaticky: generovaný header Playgrounds • Interaktivní prostředí pro vyzkoušení si kódu • Možnost kombinace kódu s HTML textem (interaktivní učebnice) Playgrounds demo Díky! Otázky?