Slide 1

Slide 1 text

Swift 1.2 5IFMPOHBXBJUFEMBOHVBHFVQEBUFT

Slide 2

Slide 2 text

cockscomb

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Swift 1.2 5IFMPOHBXBJUFEMBOHVBHFVQEBUFT

Slide 5

Slide 5 text

if let

Slide 6

Slide 6 text

let condition = true let aNumber: Int? = 3 let anotherNumber: Int? = 7 if condition { if let a = aNumber { if let b = anotherNumber { if a < b { println(a + b) } } } } Swift 1.1

Slide 7

Slide 7 text

let condition = true let aNumber: Int? = 3 let anotherNumber: Int? = 7 if condition, let a = aNumber, let b = anotherNumber where a < b { println(a + b) } Swift 1.2

Slide 8

Slide 8 text

let constant must be initialized before use

Slide 9

Slide 9 text

let hour = NSCalendar.currentCalendar() .component(.CalendarUnitHour, fromDate: NSDate()) var meridiem: String if hour < 12 { meridiem = "AM" } else { meridiem = "PM" } println(meridiem) Swift 1.1

Slide 10

Slide 10 text

let hour = NSCalendar.currentCalendar() .component(.CalendarUnitHour, fromDate: NSDate()) let meridiem: String if hour < 12 { meridiem = "AM" } else { meridiem = "PM" } println(meridiem) Swift 1.2

Slide 11

Slide 11 text

Set

Slide 12

Slide 12 text

let abc: NSSet = NSSet(objects: "A", "B", "C") if NSSet(objects: "A").isSubsetOfSet(abc) { println(abc) } Swift 1.1

Slide 13

Slide 13 text

let abc: Set = ["A", "B", "C"] if abc.isSupersetOf(["A"]) { println(abc) } Swift 1.2

Slide 14

Slide 14 text

Static methods and properties

Slide 15

Slide 15 text

class StaticPropertiesAndMethods { static func printDate() { println(date) } static let date = NSDate() } StaticPropertiesAndMethods.printDate() // => "2015-04-10 07:01:00 +0000" Swift 1.2

Slide 16

Slide 16 text

Non-Void return types in Void contexts

Slide 17

Slide 17 text

let wantsVoid: (() -> Void) = { "non-Void here" return } Swift 1.1

Slide 18

Slide 18 text

let wantsVoid: (() -> Void) = { "non-Void here" } Swift 1.2

Slide 19

Slide 19 text

zip

Slide 20

Slide 20 text

let ordinals = ["first", "second", "third"] let values = [1, 2, 3] var ordinalsDict: [String: Int] = [:] for (number, key) in enumerate(ordinals) { if number < values.count { ordinalsDict[key] = values[number] } } println(ordinalsDict) // => ["first": 1, "second": 2, "third": 3] Swift 1.1

Slide 21

Slide 21 text

let ordinals = ["first", "second", "third"] let values = [1, 2, 3] var ordinalsDict: [String: Int] = [:] for (key, value) in zip(ordinals, values) { ordinalsDict[key] = value } println(ordinalsDict) // => ["first": 1, "second": 2, "third": 3] Swift 1.2

Slide 22

Slide 22 text

Type casting

Slide 23

Slide 23 text

let any: AnyObject = 3 let number: Int = any as Int @objc protocol SomeProtocol { func something() -> String } class SomeClass: SomeProtocol { func something() -> String { return "Something awesome" } } let some: AnyObject = SomeClass() if some is SomeProtocol { println((some as SomeProtocol).something()) } Swift 1.1

Slide 24

Slide 24 text

let any: AnyObject = 3 let number: Int = any as! Int protocol SomeProtocol { func something() -> String } class SomeClass: SomeProtocol { func something() -> String { return "Something awesome" } } let some: AnyObject = SomeClass() if some is SomeProtocol { println((some as! SomeProtocol).something()) } Swift 1.2

Slide 25

Slide 25 text

@noescape

Slide 26

Slide 26 text

class Prefix { let string: String let prefix: String? init(string: String, prefix: String? = nil) { self.string = string self.prefix = prefix } func perform() -> String { return prefix.map { $0 + self.string } ?? string } } println(Prefix(string: "String", prefix: "NS").perform()) // => "NSString" println(Prefix(string: "String").perform()) // => "String" Swift 1.1

Slide 27

Slide 27 text

class Prefix { let string: String let prefix: String? init(string: String, prefix: String? = nil) { self.string = string self.prefix = prefix } func perform() -> String { return prefix.map { $0 + string } ?? string } } println(Prefix(string: "String", prefix: "NS").perform()) // => "NSString" println(Prefix(string: "String").perform()) // => "String" Swift 1.2

Slide 28

Slide 28 text

enum Optional : Reflectable, NilLiteralConvertible { case None case Some(T) func map(f: @noescape (T) -> U) -> U? } Swift 1.2

Slide 29

Slide 29 text

@autoclosure assert(someProperty != nil) @autoclosure(escaping) assert(self.someProperty != nil)

Slide 30

Slide 30 text

flatMap

Slide 31

Slide 31 text

let mapped = ["A B C", "D E", "F"].map { $0.componentsSeparatedByString(" ") } println(mapped) // => [[A, B, C], [D, E], [F]] let flatMapped = ["A B C", "D E", "F"].flatMap { $0.componentsSeparatedByString(" ") } println(flatMapped) // => [A, B, C, D, E, F] Swift 1.2

Slide 32

Slide 32 text

func toInt(value: String) -> Int? { return value.toInt() } let one: String? = "1" let mapOne = one.map { toInt($0) } println(mapOne) // => Optional(Optional(1)) let flatMapOne = one.flatMap { toInt($0) } println(flatMapOne) // => Optional(1) Swift 1.2

Slide 33

Slide 33 text

NSEnumerator.generate() -> NSFastGenerator

Slide 34

Slide 34 text

let fonts = "/System/Library/Fonts" let files = NSFileManager() .enumeratorAtPath(fonts)! while let path: AnyObject = files.nextObject() { println(path) } Swift 1.1

Slide 35

Slide 35 text

let fonts = "/System/Library/Fonts" let files = NSFileManager() .enumeratorAtPath(fonts)! for path in files { println(path) } Swift 1.2

Slide 36

Slide 36 text

Others

Slide 37

Slide 37 text

Breaking changes • as as? as! • Remove implicit conversions from NSString/ NSArray/NSDictionary to String/Array/ Dictionary • countElements → count

Slide 38

Slide 38 text

Performances • Tools • Incremental build • Type checker • Swift • Improved many cases • Whole Module Optimization

Slide 39

Slide 39 text

Objective-C • Nullability • nullable • nonnull • NS_ASSUME_NONNULL_BEGIN, NS_ASSUME_NONNULL_END

Slide 40

Slide 40 text

The future has come

Slide 41

Slide 41 text

What’s next?