Slide 1

Slide 1 text

%FWFMPQFST*0 ాத޹໌ ⡥$MBTTNFUIPE *OD ೥݄೔ 4XJGU تͼͱײಈΛ

Slide 2

Slide 2 text

"CPVU.F

Slide 3

Slide 3 text

w ాத޹໌ w IUUQEFWDMBTTNFUIPEKQBVUIPSUBOBLBUBLBBLJ w ϞόΠϧΞϓϦαʔϏε෦ॴଐ w J04։ൃ୲౰ 4XJGU w ೥݄ೖࣾ

Slide 4

Slide 4 text

Slide 5

Slide 5 text

Slide 6

Slide 6 text

ؓ࿩ٳ୊

Slide 7

Slide 7 text

"HFOEB w Ϋϥεϝιουͱ4XJGU w 4XJGUͷ֓ཁ w 4XJGUͷΤίγεςϜ w ͜Ε͔Βͷ4XJGU w ·ͱΊ ⡥$MBTTNFUIPE *OD

Slide 8

Slide 8 text

Ϋϥεϝιουͱ4XJGU

Slide 9

Slide 9 text

Ϋϥεϝιουͱ4XJGU w ೥຤ʹ৽نҊ݅޲͚ʹ౤ೖ w 4XJGU7FSTJPO w ͦͷޙ4XJGU7FSTJPO΁ w ೥݄ʹ4XJGUରԠ w ೥຤͔Β͸৽نҊ݅͸ɺ͢΂ͯ4XJGU΁ w J04ΤϯδχΞ͸໿໊ w ֤ϓϩδΣΫτͰΞαΠϯ͞ΕΔͷ͸d໊ ⡥$MBTTNFUIPE *OD

Slide 10

Slide 10 text

֤ίϛϡχςΟ΁ͷߩݙ w USZ4XJGU w 4*-7&3εϙϯαʔ ⡥$MBTTNFUIPE *OD

Slide 11

Slide 11 text

֤ίϛϡχςΟ΁ͷߩݙ w ",*#"TXJGU w Ϋϥεϝιουओ࠵ w ຖ݄ճΛ౒ྗ໨ඪͰ։࠵ w ೥݄։࠵Ҏ߱օۈ ⡥$MBTTNFUIPE *OD

Slide 12

Slide 12 text

)","5"TXJGU

Slide 13

Slide 13 text

ॳֶऀ޲͚ͷ ಺༰ͱͳΓ·͢

Slide 14

Slide 14 text

4XJGUͷ֓ཁ

Slide 15

Slide 15 text

4XJGUͷओͳಛ௃ w MFU WBS w ܕਪ࿦ w $MBTT 4USVDU w 0QUJPOBM w &OVN w (FOFSJDT w $MPTVSF w 1SPUPDPM w 1SPUPDPM&YUFOTJPO w NBQqBUNBQ ⡥$MBTTNFUIPE *OD

Slide 16

Slide 16 text

ม਺ w MFU w JNNVUBCMFͳ஋Λѻ͏ w ࠶୅ೖ͸ෆՄೳ w ෆม஋Ͱ͋Δ͜ͱΛอূ͢Δ w WBS w NVUBCMFͳ஋Λѻ͏ w ࠶୅ೖ͸Մೳ w 7FSTJPOҎ߱͸NFUIPEͷҾ਺ʹࢦఆͰ͖ͳ͘ͳͬͨ ⡥$MBTTNFUIPE *OD

Slide 17

Slide 17 text

ม਺ let array: [String] = ["aaa"] array.append("bbb") array.append("ccc") array.append("ddd") ⡥$MBTTNFUIPE *OD let value: Int = 10 value = value + 2

Slide 18

Slide 18 text

ม਺ ⡥$MBTTNFUIPE *OD class Area { var code: String = "0010" } let area: Area = Area() area.code = "0012"

Slide 19

Slide 19 text

ܕਪ࿦ w ܕਪ࿦ w એݴ࣌ʹܕΛࢦఆ͠ͳͯ͘΋ɺ༩͑ΒΕͨγάωνϟ͔Β
 ࣗಈతʹܕΛ൑ผ͢Δ ⡥$MBTTNFUIPE *OD let num1 = 1.0 // Double let num2 = 2 // Int let str = "Hello!" // String

Slide 20

Slide 20 text

ܕਪ࿦ ⡥$MBTTNFUIPE *OD let num3 = 1 + 1.0 // Double let num4: CGFloat = 1.5 let num5 = num4 + 1.2 // CGFloat

Slide 21

Slide 21 text

ܕਪ࿦ ⡥$MBTTNFUIPE *OD let num4: CGFloat = 1.5 let num5 = 1.2 let num6 = num4 + num5

Slide 22

Slide 22 text

Ϋϥε w $MBTT w ࢀরܕ w ୅ೖ͞Εͨ৔߹͸ΞυϨε͕ࢀর͞ΕΔ ⡥$MBTTNFUIPE *OD w 4USVDU w ஋ܕ w ୅ೖ͞Εͨ৔߹͸ίϐʔ͞ΕΔ w 0CKFDUJWF$ʹ͸ແ͍ͷͰ0CKFDWJUF$͔ΒݺͿ৔߹͸ /40CKFDUΛܧঝͨ͠Ϋϥεʹ͢Δඞཁ͕͋Δ

Slide 23

Slide 23 text

Ϋϥε ⡥$MBTTNFUIPE *OD class Area { var name: String = "" } let area1 = Area() area1.name = "AAAA" let area2 = area1 area2.name = "BBBB" let area3 = area1 area3.name = "CCCC" area1.name // CCCC area2.name // CCCC area3.name // CCCC

Slide 24

Slide 24 text

Ϋϥε ⡥$MBTTNFUIPE *OD struct Area { var name: String mutating func set(name: String) { self.name = name } } let area1 = Area(name: "AAAA") var area2 = area1 area2.set(name: "BBBB") var area3 = area1 area3.set(name: "CCCC") area1.name // AAAA area2.name // BBBB area3.name // CCCC

Slide 25

Slide 25 text

&OVN w &OVN w ୈҰڃΦϒδΣΫτʢpSTUDMBTTUZQFʣ w &JUIFSͷΑ͏ͳ࢖͍ํ͕Ͱ͖Δ w 3BX7BMVFʢ4USJOH*OU'MPBUʣͰఆٛͰ͖Δ w ಠࣗͷϝιουΛఆٛͰ͖Δ ⡥$MBTTNFUIPE *OD

Slide 26

Slide 26 text

&OVN ⡥$MBTTNFUIPE *OD enum PeachBoySlave: Int { case Dog case Monkey case Bird } print(PeachBoySlave.Bird.rawValue) // 2 w 3BX7BMVF *OU

Slide 27

Slide 27 text

&OVN ⡥$MBTTNFUIPE *OD enum PeachBoySlave: String { case Dog = "Dog" case Monkey = "Monkey" case Bird = "Bird" } print(PeachBoySlave.Bird.rawValue) // Bird w 3BX7BMVF 4USJOH

Slide 28

Slide 28 text

&OVN ⡥$MBTTNFUIPE *OD enum PeachBoySlave: String { case Dog case Monkey case Bird enum Actor { case Grandpa case Grandma } } w ωετͯ͠ఆٛ͢Δ͜ͱ΋Ͱ͖Δ

Slide 29

Slide 29 text

&OVN ⡥$MBTTNFUIPE *OD enum PeachBoyEnemy { case Oni case Boss func encount() { print("Enemy") } } w ಠࣗϝιουͷఆٛ

Slide 30

Slide 30 text

&OVN ⡥$MBTTNFUIPE *OD w ܭࢉܕϓϩύςΟͷఆٛ enum PeachBoyEnemy { case Oni case Boss … var count: Int { switch self { case Oni: return 10 case Boss: return 1 } } }

Slide 31

Slide 31 text

&OVN ⡥$MBTTNFUIPE *OD w ֨ೲܕϓϩύςΟ͸ఆٛͰ͖ͳ͍ enum PeachBoyEnemy { case Oni case Boss … var power: Int = 10 }

Slide 32

Slide 32 text

0QUJPOBM w 0QUJPOBM w OJM͔ɺ஋͕͋Δ͔Λѻ͏ w OJMΛऔΓಘΔ஋Λ҆શʹΞΫηε͢ΔػߏΛఏڙ͢Δ w 0CKFDUJWF$Ͱར༻͢Δ৔߹͸ɺ@/VMMBCMF΍@/POOVMMΛ
 ࢦఆ͢Δඞཁ͕͋Δ ⡥$MBTTNFUIPE *OD

Slide 33

Slide 33 text

0QUJPOBM ⡥$MBTTNFUIPE *OD public enum Optional : ExpressibleByNilLiteral w 0QUJPOBM͸&OVNͰఆٛ͞Ε͍ͯΔ let value: Optional = 10

Slide 34

Slide 34 text

0QUJPOBM w γϯλοΫεγϡΨʔΛ׆༻͢Δ ⡥$MBTTNFUIPE *OD let value: Int? = 10 let value: Optional = 10

Slide 35

Slide 35 text

0QUJPOBM w 0QUJPOBM͕OJMʢDBTFOPOFʣͷঢ়ଶͷ࣌ʹ
 ΞΫηε͢ΔͱΫϥογϡ͢Δ ⡥$MBTTNFUIPE *OD values.append("aaaa") // crash!! var values: [String]?

Slide 36

Slide 36 text

0QUJPOBM w JGMFUઅΛ༻͍Δ͜ͱͰ҆શʹ0QUJPOBMͷΞϯϥοϓ Λߦ͑Δ ⡥$MBTTNFUIPE *OD if let unwrapValue = value { print(unwrapValue) // 10 } let value: Int? = 10

Slide 37

Slide 37 text

0QUJPOBM w HVBSEઅΛ༻͍ͯܖ໿ϓϩάϥϛϯάΛߦ͏ ⡥$MBTTNFUIPE *OD guard let unwrapValue = value else { return } unwrapValue // 10 let value: Int? = 10 guard let unwrapValue = value, unwrapValue < 10 else { return }

Slide 38

Slide 38 text

0QUJPOBM w ʮ ʯ͸ΞϯϥοϓΛࢼΈΔ w 0QUJPOBM$IBJOJOHͱݺ͹ΕΔ w ΞϯϥοϓͰ͖ͳ͍ࡍ͸ແࢹ͞ΕΔ ⡥$MBTTNFUIPE *OD values?.append("aaaa") // ignore var values: [String]?

Slide 39

Slide 39 text

0QUJPOBM w ʮʯ͸ڧ੍ΞϯϥοϓΛࢼΈΔ w ΞϯϥοϓͰ͖ͳ͍৔߹͸Ϋϥογϡ͢Δ ⡥$MBTTNFUIPE *OD values!.append("aaaa") // crash!! var values: [String]?

Slide 40

Slide 40 text

0QUJPOBM w ۜͷ஄ؙͰ͸ͳ͍ w 0QUJPOBMΛېس͢Δ͋·ΓɺࢥΘ͵ͱ͜ΖͰ
 όάΛຒΊࠐΉՄೳ΋͋Δ ⡥$MBTTNFUIPE *OD let results = values ?? [] var values: [String]?

Slide 41

Slide 41 text

(FOFSJDT w ॊೈʹ࠶ར༻Մೳͳܕ΍ؔ਺Λఆٛ͢Δ ⡥$MBTTNFUIPE *OD class List { private var elements = [Element]() func append(element: Element) { elements.append(element) } } let intList = List() intList.append(element: 1) // [1] intList.append(element: 2) // [1, 2] let stringList = List() stringList.append(element: "AAAA") // ["AAAA"] stringList.append(element: "BBBB") // ["AAAA", "BBBB"]

Slide 42

Slide 42 text

(FOFSJDT w &OVNʹ΋(FOFSJDTΛఆٛ͢Δ͜ͱ͕Ͱ͖Δ w 3FTVMUܕ͕ྑ͍ྫ ⡥$MBTTNFUIPE *OD public enum Result { case Success(Value) case Failure(Error) } func result(with code: Int?) -> Result { guard let unwrapedCode = code else { let error = NSError( domain: "MyApp", code: 0, userInfo: nil)) return .Failure(error) ɹɹ } return .Success(unwrapedCode) }

Slide 43

Slide 43 text

(FOFSJDT ⡥$MBTTNFUIPE *OD Alamofire.request( Router.ItemSearch(parameters)) .responseJSON { response in switch response.result { case .Success(let value) : let json = JSON(value) items = results.keys.map { Item(json: results[$0]!) } case .Failure(let error) : print("error: \(error)") } }

Slide 44

Slide 44 text

$MPTVSF w $MPTVSF w 0CKFDUJWF$ʹ͓͚Δ#MPDLT w ίʔϧόοΫॲཧ౳Λ؆ܿʹهड़Ͱ͖Δ ⡥$MBTTNFUIPE *OD

Slide 45

Slide 45 text

$MPTVSF w ίʔϧόοΫॲཧͷఆٛ ⡥$MBTTNFUIPE *OD class Object { var handler: ((String) -> Void)? init(handler: ((String) -> Void)?) { self.handler = handler } func didReceive(message: String) { handler?(message) } }

Slide 46

Slide 46 text

$MPTVSF w ίʔϧόοΫॲཧͷఆٛ ⡥$MBTTNFUIPE *OD let obj = Object { message in print(message) // Hello World!! } … obj.didReceive(message: "Hello World!!")

Slide 47

Slide 47 text

$MPTVSF w UZQFBMJBTͰએݴ͢Δ͜ͱͰϝϯςφϯεੑΛ޲্ ⡥$MBTTNFUIPE *OD class Object { typealias ReceiveHandler = ((String) -> Void) var handler: ReceiveHandler? init(handler: ReceiveHandler?) { self.handler = handler } func didReceive(message: String) { handler?(message) } }

Slide 48

Slide 48 text

$MPTVSF w TFMGͷࢀরʹ஫ҙ w $MPVTVSFͰTFMGͷύϥϝʔλʹΞΫηε͢Δ࣌ɺVOPXOFEɺ ΋͘͠͸XFBLΛࢦఆ͠ͳ͍৔߹͸ڧࢀর͞ΕΔͨΊɺ॥؀ࢀ রΛҾ͖ى͜͢ w $MPTVSF࣮ߦ࣌ʹTFMG͕OJMͷՄೳੑ͕͋Δ৔߹͸
 VOPXOFEɺ΋͘͠͸XFBLΛࢦఆ͢Δ
 ⡥$MBTTNFUIPE *OD

Slide 49

Slide 49 text

$MPTVSF w TFMGͷࢀরʹ஫ҙ w TFMG͕OJMʹͳΔՄೳੑ͕ͳ͍৔߹͸VOPXOFEΛࢦఆ͢Δ w TFMG͕OJMͷ৔߹͸Ϋϥογϡ͢Δ
 ⡥$MBTTNFUIPE *OD let obj = Object { [unowned self] message in self.receiveMessage = message }

Slide 50

Slide 50 text

$MPTVSF w TFMGͷࢀরʹ஫ҙ w TFMG͕OJMʹͳΔՄೳੑ͕͋Δ৔߹͸XFBLΛࢦఆ͢Δ w ΞϯϥοϓॲཧΛهࡌ͢Δඞཁ͕͋Δ
 ⡥$MBTTNFUIPE *OD let obj = Object { [weak self] message in self?.receiveMessage = message } let obj = Object { [weak self] message in guard let weakSelf = self else { return } weakSelf.receiveMessage = message }

Slide 51

Slide 51 text

1SPUPDPM w 1SPUPDPM w Ϋϥεʹରͯ͠ػೳΛ௥Ճ͍ͯ͘͠ w ৼΔ෣͍Λఆٛ͢Δ w ΤϯίʔυͰ͖ΔσίʔυͰ͖ΔදࣔͰ͖ΔʜFUD ⡥$MBTTNFUIPE *OD IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED 1SPUPDPM0SJFOUFE1SPHSBNNJOHJO4XJGU

Slide 52

Slide 52 text

1SPUPDPM w ৼΔ෣͍ʢϝιουʣΛఆٛ͠ɺඞཁʹԠͯ͡
 ֦ு͢Δ͜ͱͰॊೈͳઃܭ͕Մೳ ⡥$MBTTNFUIPE *OD protocol Showable { func show() } class Object: Showable { func show() { print("Show") } }

Slide 53

Slide 53 text

1SPUPDPM ⡥$MBTTNFUIPE *OD protocol Showable { func show() } protocol Decodable { func decode() } class Object: Showable, Decodable { func show() { print("Show") } func decode() { print("decode") } }

Slide 54

Slide 54 text

1SPUPDPM w BTTPDJBUFEUZQFͰ1SPUPDPMͰ࢖͏ܕͷ
 ϓϨʔεϗϧμʔΛએݴ͢Δ͜ͱͰ൚༻ੑΛ࣋ͨͤΔ ⡥$MBTTNFUIPE *OD protocol Response { associatedtype ResponseType func receive(response: ResponseType) } class Object: Response { typealias ResponseType = [String : Any] func receive(response: ResponseType) { print(response) } }

Slide 55

Slide 55 text

&YUFOTJPO w &YUFOTJPO w ఆٛΛ֦ு࣮ͨ͠૷ʢσϑΥϧτ࣮૷ʣ w 0CKFDUJWF$ʹ΋ΧςΰϦͱ͍͏ܗͰࣅͨΑ͏ͳػೳ͕
 ఏڙ͞Ε͍ͯͨ ⡥$MBTTNFUIPE *OD

Slide 56

Slide 56 text

&YUFOTJPO w &YUFOTJPO ⡥$MBTTNFUIPE *OD class Object { } extension Object { func receive() { print("receive") } }

Slide 57

Slide 57 text

1SPUPDPM&YUFOTJPO w ܕ੍໿ w ܕ੍໿Λ͚ͭΔ͜ͱͰద༻ൣғΛݶఆ͢Δ ⡥$MBTTNFUIPE *OD protocol Encodable { func encode() } extension Encodable where Self: Object1 { func encode() { print("encode1") } } extension Encodable where Self: Object2 { func encode() { print("encode2") } }

Slide 58

Slide 58 text

NBQqBUNBQ w Ϟμϯͳؔ਺܈ w NBQ w qBUNBQ w pMUFS w SFEVDF ⡥$MBTTNFUIPE *OD

Slide 59

Slide 59 text

NBQqBUNBQ w 4FRVFODF ⡥$MBTTNFUIPE *OD enum PokemonType: String { case Grass = "Grass" case Water = "Water" case Fire = "Fire" case Electric = "Electric" } let type1 = PokemonType(rawValue: "Grass") // PokemonType.Grass let type2 = PokemonType(rawValue: "Evil") // nil

Slide 60

Slide 60 text

NBQqBUNBQ w 4FRVFODF w NBQͷద༻ ⡥$MBTTNFUIPE *OD let types = ["Grass", "Water", "Fire", "Electric"] let pokemonTypes = types.map { PokemonType(rawValue: $0) } [Optional(PokemonType.Grass), Optional(PokemonType.Water), Optional(PokemonType.Fire), Optional(PokemonType.Electric)]

Slide 61

Slide 61 text

NBQqBUNBQ w 4FRVFODF w NBQͷద༻ ⡥$MBTTNFUIPE *OD let types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.map { PokemonType(rawValue: $0) } [Optional(PokemonType.Grass), Optional(PokemonType.Water), Optional(PokemonType.Fire), nil]

Slide 62

Slide 62 text

NBQqBUNBQ w 4FRVFODF w qBUNBQͷద༻ ⡥$MBTTNFUIPE *OD let types = ["Grass", "Water", "Fire", "Electric"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) } [PokemonType.Grass, PokemonType.Water, PokemonType.Fire, PokemonType.Electric]

Slide 63

Slide 63 text

NBQqBUNBQ w 4FRVFODF w qBUNBQͷద༻ ⡥$MBTTNFUIPE *OD let types = ["Grass", "Water", "Fire", "Ice"] let pokemonTypes = types.flatMap { PokemonType(rawValue: $0) } [PokemonType.Grass, PokemonType.Water, PokemonType.Fire]

Slide 64

Slide 64 text

NBQqBUNBQ w $PMMFDUJPO w NBQͷద༻ ⡥$MBTTNFUIPE *OD let types1 = ["Electric", "Electric", "Fire"] let types2 = ["Water", "Ice"] let types3 = ["Fire", "Grass", "Rock", "Grass"] let types = [types1, types2, types3].map { $0 } [["Electric", "Electric", "Fire"], ["Water", "Ice"], ["Fire", "Grass", "Rock", "Grass"]]

Slide 65

Slide 65 text

NBQqBUNBQ w $PMMFDUJPO w qBUNBQͷద༻ ⡥$MBTTNFUIPE *OD let types1 = ["Electric", "Electric", "Fire"] let types2 = ["Water", "Ice"] let types3 = ["Fire", "Grass", "Rock", "Grass"] let types = [types1, types2, types3].flatMap { $0 } ["Electric", "Electric", "Fire", "Water", "Ice", "Fire", "Grass", "Rock", "Grass"]

Slide 66

Slide 66 text

NBQqBUNBQ w $PMMFDUJPO w qBUNBQͷద༻ ⡥$MBTTNFUIPE *OD let types1 = ["Electric", "Electric", "Fire"] let types2 = ["Water", "Ice"] let types3 = ["Fire", "Grass", "Rock", "Grass"] let types = [types1, types2, types3].flatMap { $0 }. flatMap { PokemonType(rawValue: $0) } [PokemonType.Electric, PokemonType.Electric, PokemonType.Fire, PokemonType.Water, PokemonType.Fire, PokemonType.Grass, PokemonType.Grass]

Slide 67

Slide 67 text

NBQqBUNBQ w 0QUJPOBM w NBQͷద༻ ⡥$MBTTNFUIPE *OD let value: String? = "Fire" let value1 = value.map { PokemonType(rawValue: $0) } Optional(Optional(PokemonType.Fire))

Slide 68

Slide 68 text

NBQqBUNBQ w 0QUJPOBM w qBUNBQͷద༻ ⡥$MBTTNFUIPE *OD let value: String? = "Fire" let value1 = value.flatMap { PokemonType(rawValue: $0) } Optional(PokemonType.Fire)

Slide 69

Slide 69 text

NBQqBUNBQ w 0QUJPOBM w 0QUJPOBM΁ͷΞΫηεΛߦ͏ ⡥$MBTTNFUIPE *OD let type = PokemonType(rawValue: "Water") let changedType = type.map { type -> PokemonType in switch type { case .Water: return PokemonType.Electric default: return type } }

Slide 70

Slide 70 text

NBQqBUNBQ w 0QUJPOBM w 0QUJPOBMಉ࢜ͷܭࢉ ⡥$MBTTNFUIPE *OD let value1: Int? = 10 let value2: Int? = 20 let value = value1.flatMap { v1 in value2.map { v2 in v1 + v2 } } Optional(30)

Slide 71

Slide 71 text

NBQqBUNBQ w 0QUJPOBM w 0QUJPOBMಉ࢜ͷܭࢉ ⡥$MBTTNFUIPE *OD let value1: Int? = 10 let value2: Int? = 20 let value3: Int? = 30 let value = value1.flatMap { v1 in value2.flatMap { v2 in value3.map { v3 in v1 + v2 + v3 } } } Optional(60)

Slide 72

Slide 72 text

NBQqBUNBQ w 0QUJPOBM w 0QUJPOBMಉ࢜ͷܭࢉ ⡥$MBTTNFUIPE *OD let value1: Int? = 10 let value2: Int? = 20 let value3: Int? = 30 let value4: Int? = 40 let value = value1.flatMap { v1 in value2.flatMap { v2 in value3.flatMap { v3 in value4.map { v4 in v1 + v2 + v3 + v4 } } } } Optional(100)

Slide 73

Slide 73 text

NBQqBUNBQ w 0QUJPOBM w 0QUJPOBMಉ࢜ͷܭࢉ w GPS͕ཉ͍͠ʜ w "QQMJDBUJWF4UZMFΛࢼ͢ͱ͍͏ख΋͋Δ w $VSSZ3VOFT ⡥$MBTTNFUIPE *OD

Slide 74

Slide 74 text

NBQqBUNBQ ⡥$MBTTNFUIPE *OD let a: Int? = 10 let b: Int? = 20 let c: Int? = 30 let value = curry(+) <^> a <*> b <*> c w 0QUJPOBM w "QQMJDBUJWF4UZMF

Slide 75

Slide 75 text

4XJGUͷΤίγεςϜ

Slide 76

Slide 76 text

4XJGUͷϥΠϒϥϦ؅ཧ w $PDPB1PET w $BSUIBHF w 4XJGU1BDLBHF.BOBHFS ⡥$MBTTNFUIPE *OD

Slide 77

Slide 77 text

ར༻͢ΔϥΠϒϥϦ

Slide 78

Slide 78 text

௨৴ϥΠϒϥϦ w "MBNPpSF w /463-4FTTJPOΛ༻͍ͨ௨৴ϥΠϒϥϦ w *1WରԠ w )551ରԠ ⡥$MBTTNFUIPE *OD

Slide 79

Slide 79 text

ը૾औಘ w "MBNPpSF*NBHF w ඇಉظ௨৴ը૾औಘϥΠϒϥϦ ⡥$MBTTNFUIPE *OD imageView.af_setImageWithURL(url) { response in switch response.result { case .Success: imageEmptyView.hidden = true default: () } }

Slide 80

Slide 80 text

ඇಉظॲཧ w #SJHIU'VUVSFT w ඇಉظॲཧϑϨʔϜϫʔΫ w 'VUVSF1SPNJTFύλʔϯΛ4XJGUͰ΋ద༻͢Δ ⡥$MBTTNFUIPE *OD IUUQTHJUIVCDPN5IPNWJT#SJHIU'VUVSFT <4XJGU>ඇಉظॲཧϑϨʔϜϫʔΫ #SJHIU'VUVSFTdಋೖฤd

Slide 81

Slide 81 text

ඇಉظॲཧ w #SJHIU'VUVSFT ⡥$MBTTNFUIPE *OD public func read(keyForId: String, valueForId: AnyObject) -> Future { let promise = Promise() dispatch_async(persistenceQueue) { [unowned self] in let context = NSManagedObjectContext.defaultContext() let previousRecord = MO.MR_findFirstByAttribute( keyForId, withValue: valueForId, inContext: context) dispatch_async(self.callbackQueue) { if let record = previousRecord { promise.success(record) } else { promise.failure(PersistenceServiceNotFoundError) } } } return promise.future }

Slide 82

Slide 82 text

ඇಉظॲཧ w #SJHIU'VUVSFT ⡥$MBTTNFUIPE *OD presenter.read( keyForId: "name", valueForId: "Tanaka").onSuccess { [weak self] user in self?.update(user: user) }.onFailure { [weak self] error in self?.showFailedAlertWithError(error) } }

Slide 83

Slide 83 text

͜Ε͔Βͷ4XJGU

Slide 84

Slide 84 text

͜Ε͔Βͷ4XJGU w 7FSTJPOରԠ w ίϯύΠϥͱͷ෇͖߹͍ํ ⡥$MBTTNFUIPE *OD

Slide 85

Slide 85 text

7FSTJPOରԠ w ഁյతͳมߋ w /4QSFpY͔Βͷ୤٫ w શ෦ϦϓϨΠε͞Ε͍ͯΔΘ͚Ͱ͸ͳ͍ʜ w "1*%FTJHOͷมߋ w ϝιουͷҾ਺ͷϥϕϧͷࢦఆ͕มߋ w Yܥͱͷޓ׵ੑ͸ແ͍ w 9DPEFͰ͕௥Ճ͞Ε͕ͨɺ
 ࣍ͷόʔδϣϯͰ͸%FQMJDBUFEʹͳΔ
 ⡥$MBTTNFUIPE *OD

Slide 86

Slide 86 text

ίϯύΠϥͱͷ෇͖߹͍ํ w ίϯύΠϥʹ༏͘͠ w ෳࡶͳ֊૚Λ࣋ͭ%JDUJPOBSZΛఆٛ͠ͳ͍ w ෳࡶͳϝιουνΣΠϯ͸ߦΘͳ͍ ⡥$MBTTNFUIPE *OD

Slide 87

Slide 87 text

7FSTJPOରԠ w 7FSTJPOͰରԠͰ͖ͳ͔ͬͨػೳ͕੝Γࠐ·ΕΔ w "#*ͷ҆ఆԽ͕ߦΘΕΔ w ࠓ౓ͦ͜ɺɺɺຊ౰ʹɺɺɺ ⡥$MBTTNFUIPE *OD

Slide 88

Slide 88 text

·ͱΊ ⡥$MBTTNFUIPE *OD w 0CKFDUJWF$ͱൺ΂ͯϞμϯͳݴޠΛ
 ໨ࢦ͍ͯ͠Δ͕ɺ·ͩ·ͩൃల్্ w 7FSTJPOͷมߋ͸ഁյతͰ͸͋Δ͕ɺ
 ࠓͷ͏ͪʹ௥ਵ͓͔ͯ͠ͳ͍ͱෛͷҨ࢈ʹͳΔ w ৽ͨͳػೳΛֶͿ͜ͱͰɺॊೈͳઃܭΛ
 औΓೖΕΔ͜ͱ͕Ͱ͖Δ

Slide 89

Slide 89 text

%FWFMPQFST*0 ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ εϥΠυ͸ޙ೔ϒϩάͰެ։͠·͢ɻ " ⡥$MBTTNFUIPE *OD #cmdevio