Slide 1

Slide 1 text

ܕ @yashigani Cocoaษڧձؔ੢ #60

Slide 2

Slide 2 text

yashigani id:yashigani_w @yashigani Mobile Application Engineer http://yashigani.hatenablog.com Hatena

Slide 3

Slide 3 text

https://flic.kr/p/nBzE6V ܕʹϋϚͬͨ͜ͱ͸͋Γ·͔͢ • ίϯύΠϧΤϥʔʹͳΔ΍ͭͰ͠ΐʁ • ܕ੍ͬͯ໿ͳ͚ͩͰͱʹ͔͘अຐ • id࠷ߴ΍Μʂʂʂܕͱ͔͍ΒΜʂʂʂ

Slide 4

Slide 4 text

ܕͬͯԿʁ

Slide 5

Slide 5 text

ܕ͸ৼΔ෣͍

Slide 6

Slide 6 text

ৼΔ෣͍ • ৼΔ෣͍ = σʔλߏ଄ + ॲཧ • Ͳ͏͍͏σʔλ͕Ͳ͏ಈ࡞͢Δ͔༧૝Ͱ͖Δ • ΠϯλʔϑΣʔε͕ݫ֨

Slide 7

Slide 7 text

$

Slide 8

Slide 8 text

ΞυϨε௕ͷϝλσʔλ • ϝϞϦۭؒʹ͓͚Δม਺ͷҐஔ • ௿ϨΠϠͷॲཧ͕Մೳͳނ • ϓϦϛςΟϒ͗͢Δ

Slide 9

Slide 9 text

0CKFDUJWF$

Slide 10

Slide 10 text

ৼΔ෣͍ͷϝλσʔλ • isaϙΠϯλ • ม਺͕ৼΔ෣͏΂͖͜ͱΛࣔࠦ(ಈతσΟεύον) • ͨͩ͠ඞͣ͠΋ै͑Δͱ͸ݶΒͳ͍ • ม਺ͷৼΔ෣͍Λଋറ͢Δ΋ͷͰ͸ແ͍

Slide 11

Slide 11 text

4XJGU

Slide 12

Slide 12 text

ৼΔ෣͍Λ໿ଋ͢Δ΋ͷ • ৼΔ෣͍Λม਺ʹଋറ • ͋Δܕͷม਺͸ͦͷܕͷৼΔ෣͍͔͠͠ͳ͍ • ܕͷ͋Δϓϩάϥϛϯά͕Մೳ

Slide 13

Slide 13 text

ͳͥϓϩάϥϜʹ ܕ͕ඞཁͳͷ͔

Slide 14

Slide 14 text

ܕ ܕ͕͋Δ͔ΒɺܕഁΓɻ ܕ͕ͳ͚Ε͹୯ͳΔʮܗແ͠ʯ ʕेീ୅໨தଜצࡾ࿠ Վ෣ب໾ऀ

Slide 15

Slide 15 text

/4%JDUJPOBSZ

Slide 16

Slide 16 text

NSDictionary *user = //... NSString *name = user[@"name"];

Slide 17

Slide 17 text

NSDictionary *user = //... NSString *name; if ([user[@"name"] isKindOfClass: [NSString class]]) { //!!!!! name = user[@"name"]; } else { //!!!!! }

Slide 18

Slide 18 text

https://flic.kr/p/7BD2UE Too bad ߏ଄͕ෆ໌ͳͷͰσʔλͷଘࡏΛஅఆͰ͖ͳ͍ Կ͕ೖ͍ͬͯΔͷ͔ෆ໌ͳͷͰσʔλܕΛࢦఆ ৼΔ෣͍͕ແ͍

Slide 19

Slide 19 text

ܕ͕ແ͍

Slide 20

Slide 20 text

.PEFM0CKFDU JO0CKFDUJWF$

Slide 21

Slide 21 text

@interface User : NSObject @property (copy) NSString *name; @property NSUInteger age; @property (getter=isPremium) BOOL premium; @end

Slide 22

Slide 22 text

User *user = //... UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@" cell"]; cell.textLabel.text = user.name;

Slide 23

Slide 23 text

User *user = //... UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@" cell"]; if (user.name != nil) { cell.textLabel.text = user.name; } else { //!!!!! }

Slide 24

Slide 24 text

https://flic.kr/p/i74K6M Too bad σʔλͷߏ଄ͱܕ͸දݱͰ͖ͨ ΠϯλʔϑΣʔε͕ෆఆ(nilͷՄೳੑ) ৼΔ෣͍͚͕ͩ͋Δ(ଋറ͕ແ͍)

Slide 25

Slide 25 text

ܗແ͠

Slide 26

Slide 26 text

.PEFM0CKFDU JO4XJGU

Slide 27

Slide 27 text

struct User { let name: String let age: Int let isPremium: Bool }

Slide 28

Slide 28 text

let user = //... let cell = tableView.dequeueReusableCellWithId entifier("cell") cell?.titleLabel.text = user.name

Slide 29

Slide 29 text

https://flic.kr/p/egaNwP Relaxed ෆ֬ఆͳཁૉ͸ϏδωεϩδοΫʹӅṭ ΞϓϦέʔγϣϯ͸σʔλΛදࣔ͢Δ͚ͩ ৼΔ෣͍Λଋറ͢Δ͜ͱͰ໿ଋ͞Εͨڍಈ

Slide 30

Slide 30 text

5IJTJTܕ

Slide 31

Slide 31 text

ܕͷ͋ΔϓϩάϥϜ • ৼΔ෣͍͕໌֬Ͱ׬શ • ͕ͨͬͯ͠ෆඞཁͳ৺഑͕͍Βͳ͍ • ϏδωεϩδοΫͱΞϓϦέʔγϣϯͷ෼཭ • ΠϯλʔϑΣʔεͷΈʹґଘ࣮ͨ͠૷

Slide 32

Slide 32 text

0OFNPSFUIJOH

Slide 33

Slide 33 text

func parse(JSON: AnyObject?) -> (User?, NSError?) let JSON: AnyObject? = //... let (user, error) = parse(JSON) if let e = error { //... return } if let u = user { //... } else { // maybe user is nil... }

Slide 34

Slide 34 text

https://flic.kr/p/DC3Q Too bad user΋error΋nilͷͱ͖͸Ͳ͏͍͏Τϥʔʁ ΋ͬͱ΋ͬͱstrictʹදݱ͍ͨ͠ (User?, NSError?)͸ૉ๿͗͢Δ

Slide 35

Slide 35 text

ܕΛഁΔ ܕʹΑΔܕͷந৅Խ

Slide 36

Slide 36 text

3FTVMU5

Slide 37

Slide 37 text

enum Result { case Success(T) case Failure(NSError) init(_ value: T) { self = .Success(value) } init(_ error: NSError) { self = .Failure(error) } }

Slide 38

Slide 38 text

ܕഁΓٕͦͷ ʙHFOFSJDTʙ

Slide 39

Slide 39 text

enum Result { case Success(T) case Failure(NSError) init(_ value: T) { self = .Success(value) } init(_ error: NSError) { self = .Failure(error) } } generics

Slide 40

Slide 40 text

ҦΘ͹ϫΠϧυΧʔυܕ • ͱΓ͋͑ͣ͸ͳΜͰ΋ೖΕΒΕΔܕ • ಉ͡ϥϕϧͷ΋ͷ͸ಉ͡ܕ • ΠϯλʔϑΣʔεΛܾΊͨͱ͖ʹܕ͕ܾ·Δ • func parse(_:AnyObject) -> Result • Any/AnyObjectͱҧͬͯղ͘ͱ͖ʹ౎౓ͳʹ͔
 ͔֬ΊΔඞཁ͕ແ͍

Slide 41

Slide 41 text

ܕഁΓٕͦͷ ʙFOVNʙ

Slide 42

Slide 42 text

enum Result { case Success(T) case Failure(NSError) init(_ value: T) { self = .Success(value) } init(_ error: NSError) { self = .Failure(error) } } enum

Slide 43

Slide 43 text

ෳ਺ͷঢ়ଶΛऔΓ͏Δ • Aঢ়ଶͳΒaΛ࣋ͬͯΔ͚ͲɼBঢ়ଶͰ͸࣋ͬͯͳ͍ • ͱΓ͋͑ͣAnyObjectʹͿͪࠐ·ͳ͍͍ͯ͘ • ͲΕ͔ͻͱͭͷঢ়ଶ͔͠औΓಘͳ͍ • A͔ͭBͳঢ়ଶ͸ଘࡏ͠ͳ͍

Slide 44

Slide 44 text

ͭ·ΓResultͱ͸ • ੒ޭ͔ࣦഊ͔ΛऔΓ͏Δ஋ • ੒ޭͨ͠ΒT͕ɼࣦഊͨ͠ΒNSError͕ಘΒΕΔ • ୯७ʹOptional஋Λฒ΂Δͷʹൺ΂ͯѻ͍΍͍͢ • ྆ํ஋͕͋Δ྆ํແ͍ͳΜͯ͜ͱ͸͋Γ͑ͳ͍

Slide 45

Slide 45 text

func parse(JSON: AnyObject?) -> Result let JSON: AnyObject? = // ... let result = parse(JSON) switch result { case .Success(let user): // ... case .Failure(let error): // ... }

Slide 46

Slide 46 text

+VTUB&JUIFS

Slide 47

Slide 47 text

0QUJPOBM

Slide 48

Slide 48 text

Optional΋ಉྨ • Optional͸ͻͱͭͷgenericܕΛऔΔenum • enum Optional • ͳʹ͔ͷ஋͕͋Δ/ͳ͍ͷ2छྨͷঢ়ଶΛऔΓ͏Δ • SomeͩͬͨΒTΛ࣋ͬͯΔ • NoneͩͬͨΒnilΛ࣋ͬͯΔ

Slide 49

Slide 49 text

5IJTJTܕഁΓ

Slide 50

Slide 50 text

·ͱΊ

Slide 51

Slide 51 text

ܕ͸ৼΔ෣͍ͱ஌Δ ܕͷ͋ΔϓϩάϥϜ ܕΛഁΔ

Slide 52

Slide 52 text

͋Γ͕ͱ͏͍͟͝·ͨ͠