Slide 1

Slide 1 text

SwiftͱΦϒδΣΫτؒͷ௨஌ͷύλʔϯ 2018/2/20 @shtnkgm

Slide 2

Slide 2 text

࿩͢͜ͱ SwiftͱΦϒδΣΫτؒͷ௨஌ͷύλʔϯʹ͍ͭͯߟ͑·͢ 1. ௨஌ํ๏ͷઃܭʹ͍ͭͯ 2. ΞϯνύλʔϯΛؚΊͨҎԼͷ5ͭͷ௨஌ύλʔϯ 3. ύλʔϯͷൺֱͱ࢖͍෼͚ʹ͍ͭͯ

Slide 3

Slide 3 text

௨஌ͱ͸ ΦϒδΣΫτؒͷʮ௨஌ʯͱ͸ΦϒδΣΫτؒͷϝοηʔδͷ΍ ΓͱΓΛҙຯ͠·͢ɻ

Slide 4

Slide 4 text

ͳͥ௨஌ํ๏ͷઃܭ͕ඞཁ͔ • ৑௕ͳίʔυͷഉআɺ࠶ར༻ੑ޲্͍ͤͨ͞ • ίʔυΛ੹຿ʹԠͯ͡ෳ਺ͷΦϒδΣΫτ΁෼ׂ͍ͨ͠ • ෳ਺ͷΦϒδΣΫτΛѻ͏ͨΊɺͦͷ௨஌ํ๏ͷઃܭ͕ඞཁ

Slide 5

Slide 5 text

ྫ୊ɿViewͱModel Modelͷσʔλߋ৽ͷ׬ྃΛView΁ͲͷΑ͏ʹ௨஌͢Δʁ ※Prensenter΍ViewModelͳͲΞʔΩςΫνϟͷ࿩͸͜͜Ͱ͸ߟ͑ͳ͍΋ͷͱ͠·͢ɻ

Slide 6

Slide 6 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ ※SwiftͰඪ४αϙʔτ͞Ε͍ͯͳ͍ɺRxSwift΍BondͳͲͷσʔλόΠϯσΟϯάύλʔϯ͸ର৅֎

Slide 7

Slide 7 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 8

Slide 8 text

1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ • ผΦϒδΣΫτͷϝιουΛ࣮ߦ͢Δʹ͸ɺͦͷΦϒδΣΫτ ͷࢀরΛ͍࣋ͬͯΕ͹ྑ͍ • ͭ·ΓΦϒδΣΫτؒͰ૬ޓʹ௨஌Λ͢Δʹ͸͓ޓ͍ͷࢀরΛ ͍࣋ͬͯΕ͹ྑ͍

Slide 9

Slide 9 text

class View { // ˒ ModelΦϒδΣΫτ΁ͷࢀর var model: Model = Model() func receiveUIEvent() { // ModelͷviewϓϩύςΟʹࣗ਎Ληοτ model.view = self // 2. σʔλͷߋ৽ΛModelʹ௨஌ model.updateData() } // 5. UIͷߋ৽ func updateUI() { print("\(model.data)") } }

Slide 10

Slide 10 text

class Model { // ˒ ViewΦϒδΣΫτ΁ͷࢀর var view: View? var data: Int = 0 // 3. σʔλͷߋ৽ func updateData() { data += 1 // 4. View΁σʔλͷߋ৽׬ྃΛ௨஌ view?.updateUI() } }

Slide 11

Slide 11 text

͜ͷίʔυ͸ಈ͚͘Ͳ...

Slide 12

Slide 12 text

॥؀ࢀর໰୊͕͋Δ • ਖ਼ৗʹಈ࡞͢Δ͕ɺʮ॥؀ࢀরʯ(strong reference cycle)ͱ͍ ͏໰୊͋Γ • ࢀরؔ܎͕॥؀͍ͯ͠Δ৔߹ɺΦϒδΣΫτ͸ϝϞϦ͔Βղ์ ͞Εͳ͍ʢ=ϝϞϦϦʔΫʣ • ϝϞϦϦʔΫ͕૿͑ΔͱύϑΥʔϚϯε͕མͪɺ࠷ѱΞϓϦ͕ Ϋϥογϡ͢Δ

Slide 13

Slide 13 text

ิ଍: iOSͷϝϞϦ؅ཧํࣜʹ͍ͭͯʢ1/2ʣ • iOSͰ͸ϝϞϦ؅ཧΛࢀরΧ΢ϯλ(Reference Counting)ͱ͍͏ ํࣜͰߦ͍ͬͯΔ • ࢀর͞ΕΔ͝ͱʹ+1ɺࢀর͕ͳ͘ͳͬͨ࣌఺Ͱ-1

Slide 14

Slide 14 text

ิ଍: iOSͷϝϞϦ؅ཧํࣜʹ͍ͭͯʢ2/2ʣ • ࢀরΦϒδΣΫτ͕ͳ͍৔߹ɺࢀরΧ΢ϯλ͕0ʹͳΔ • OS͸ͦͷΦϒδΣΫτΛϝϞϦ͔Β։์ͯ͠΋ྑ͍ͱ൑அ

Slide 15

Slide 15 text

॥؀ࢀরύλʔϯΛվળ͍ͨ͠

Slide 16

Slide 16 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 17

Slide 17 text

2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ • weakΩʔϫʔυΛ͚ͭΔ͜ͱͰɺʮऑࢀরʯʢweak referenceʣ͢Δ • ௨ৗͷʮڧࢀরʯͱҟͳΓɺࢀরΧ΢ϯλ͕૿͑ͳ͍

Slide 18

Slide 18 text

ऑࢀরͷϓϩύςΟͰ͸ࢀরઌͷΦϒδΣΫτ͕ղ์͞Εɺnil͕ ୅ೖ͞ΕΔՄೳੑ͕͋ΔͨΊɺΦϓγϣφϧܕͰఆٛ // weakΩʔϫʔυͰऑࢀর weak var view: View?

Slide 19

Slide 19 text

॥؀ࢀর໰୊͸ղܾͨ͠

Slide 20

Slide 20 text

·ͩվྑͷ༨஍͋Γ • ViewͱModel͕ʮີ݁߹ʯ(tight coupling)Ͱ͋Δ • ີ݁߹ͳઃܭ͸มߋʹऑ͘ɺ࠶ར༻΋ͮ͠Β͍ • ͜͜Ͱݴ͏มߋʹऑ͍ͱ͍͏ͷ͸ɺ࢓༷มߋ͕ೖͬͨ৔߹ʹม ߋՕॴ͕ଟ͘ͳΔͱ͍͏ҙຯ

Slide 21

Slide 21 text

SecondView͕ModelΛ࢖͏࢓༷มߋΛ૝ఆ class Model { // View → SecondViewʹมߋ͕ඞཁʢModel͸Viewʹґଘ͍ͯ͠Δʣ weak var view: View? var data: Int = 0 func updateData() { data += 1 view?.updateUI() } }

Slide 22

Slide 22 text

ີ݁߹໰୊ͷղܾ • Model͕Viewʹґଘ͠ͳ͍ॻ͖ํʹ͢Δ • ΑΓந৅తͳΠϯλϑΣʔεʹґଘͤ͞ΔΑ͏ʹ͢Δ • Model͕ඞཁͱ͢Δந৅తͳΠϯλϑΣʔεͱ͸Կ͔

Slide 23

Slide 23 text

ந৅తͳΠϯλϑΣʔε • ʮupdateUIϝιου͕࣮ߦͰ͖Δ͜ͱʯͷΈ • updateUIϝιου͕࣮ߦͰ͖ΔΫϥεͰ͋Ε͹ͲΜͳΫϥεͰ ΋ྑ͍ • ͜ͷந৅తͳΠϯλϑΣʔεΛද͢ํ๏ͷ1ͭͱͯ͠ɺSwiftͰ ͸ϓϩτίϧ͕͋Δ ʢJavaʹ͓͚Δinterfaceʹ͍ۙ֓೦ʣ

Slide 24

Slide 24 text

updateUIϝιουΛ࣋ͭͱ͍͏֓೦ΛϓϩτίϧͰ࣮૷ // ViewProtocolʹ४ڌ͢Δܕ͸updateUI()ͱ͍͏ϝιουΛ࣋ͭ protocol ViewProtocol { func updateUI() }

Slide 25

Slide 25 text

ϓϩτίϧ͕ܕͱͯ͠ѻ͑Δ • ΠϯελϯεԽ͸Ͱ͖ͳ͍͕ɺܕͱͯ͠ѻ͑Δ protocol ViewProtocol: class { func updateUI() } class Model { // ViewͰͳ͘ViewProtocolʹґଘ weak var view: ViewProtocol? var data: Int = 0 func updateData() { data += 1 view?.updateUI() } }

Slide 26

Slide 26 text

۩৅ΫϥεΛϓϩτίϧʹ४ڌͤ͞Δ // ViewProtocolʹ४ڌ͢Δ͜ͱΛએݴ class View: ViewProtocol { var model: Model = Model() func receiveUIEvent() { model.view = self model.updateData() } // ViewProtocolʹ४ڌͨ͠ϝιου func updateUI() { print("\(model.data)") } }

Slide 27

Slide 27 text

ิ଍: Class-Only Protocols protocol ViewProtocol: class { func updateUI() } ্هͷίʔυྫͰ͸ɺViewProtocol͸classΛܧঝ͍ͤͯ͞·͢ɻ classΛܧঝ͢Δͱɺͦͷϓϩτίϧ͸Ϋϥεʹ͔͠ద༻Ͱ͖ͳ͘ ͳΓ·͢ɻ

Slide 28

Slide 28 text

ͳͥclassܧঝ͕ඞཁ͔ • ModelͷviewϓϩύςΟ͸weakʢऑࢀরʣͰఆٛ͞Ε͍ͯΔͨ ΊɺΫϥεʢࢀরܕʣͰ͋Δඞཁ͋Γ ʢߏ଄ମ΍ྻڍମ͸஋ܕͰ͋ΔͨΊNGʣ • ViewProtocol͕ΫϥεʢࢀরܕʣͰ͋Δ͜ͱΛ໌ࣔ͢ΔͨΊʹ classΛܧঝ͢Δ class Model { // weak͕͍͍ͭͯΔͷͰViewProtocol͸ࢀরܕͰ͋Δඞཁ͕͋Δ weak var view: ViewProtocol?

Slide 29

Slide 29 text

ґଘؔ܎ΛղফͰ͖ͨ • ͜ΕͰModel͕Viewʹґଘ͠ͳ͍ίʔυʹͳͬͨ • ͜Ε͸ʮϙϦϞʔϑΟζϜʯͷҰྫʹ΋ͳ͍ͬͯΔ ʢϓϩτίϧ͕ϙϦϞʔϑΟζϜͷ࣮ݱखஈͷͻͱͭʣ

Slide 30

Slide 30 text

ϙϦϞʔϑΟζϜʢpolymorphism: ଟଶੑʣ ಈతʹϝιουʹΑͬͯݺͼग़͞ΕΔΦϒδΣΫτ͕มΘΓɺͦ ͷΦϒδΣΫτʹΑͬͯৼΔ෣͍͕มΘΔͱ͍͏ੑ࣭

Slide 31

Slide 31 text

ࠓճͷྫͱϙϦϞʔϑΟζϜ • Model͸viewϓϩύςΟʹର͠updateUIϝιουΛ࣮ߦ • viewϓϩύςΟ͕Viewͳͷ͔SecondViewͳͷ͔͸஌Βͳ͍ ʢviewϓϩύςΟ͕ෳ਺ͷܕʹͳΓ͏Δ:ϙϦϞʔϑΟζϜʣ • ࣮ߦΦϒδΣΫτʹΑͬͯupdateUIϝιουͷ࣮૷͕ҟͳΔ ʢViewΛߋ৽ or SecondViewΛߋ৽ʣ

Slide 32

Slide 32 text

UIKitͱσϦήʔτύλʔϯ • UIKitϑϨʔϜϫʔΫͰ͸UITableViewDelegateɺ UIPickerViewDelegateͳͲ਺ଟ͘ͷΦϒδΣΫτͰ͜ͷύλʔ ϯΛ࠾༻ • σϦήʔτύλʔϯʹ͓͚ΔϙϦϞʔϑΟζϜͷੑ࣭Λ׆͔͢ ͜ͱͰɺ࠶ར༻ੑͷߴ͍UI෦඼Λఏڙ

Slide 33

Slide 33 text

ϝϦσϝ • !ϓϩτίϧʹΑΓ࣮૷͢΂͖ϝιου͕໌֬ • "௨৴׬ྃͷ௨஌ͷΈͳͲɺγϯϓϧͳ௨஌ͷ৔߹ʹ͸هड़ί ετͱݟ߹Θͳ͍ (σϦήʔτϓϩύςΟͷ࣮૷ɺϓϩτίϧఆٛɺϓϩτίϧ΁ ͷ४ڌ) • "Մಡੑ͕ൺֱత௿͍

Slide 34

Slide 34 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 35

Slide 35 text

3. NotificationCenterύλʔϯ • NotificationCenterΫϥεΛར༻ͨ͠௨஌ͷύλʔϯ • NotificationCenter͸ड৴ొ࿥ͨ͠ΦϒδΣΫτʹର͠৘ใΛϒ ϩʔυΩϟετ͢Δ • ௨஌ΠϯλϑΣʔε͸௨஌໊ʢจࣈྻʣͷΈ • ಉ͡௨஌໊ΛผͷΦϒδΣΫτ͔Β΋ૹ৴Ͱ͖ΔͨΊɺଟରଟ ͷ௨஌Λ࣮ݱ

Slide 36

Slide 36 text

NotificationCenterͷTips ௨஌໊͸Notification.NameΛextensionͰ֦ு͠ɺstaticϓϩύς ΟͰఆ͓ٛͯ͘͠ͱར༻͠΍͍͢ // ௨஌໊Λొ࿥ extension Notification.Name { static let updateDataNotification = Notification.Name("updateDataNotification") }

Slide 37

Slide 37 text

ड৴ొ࿥ / ૹ৴ͷ࢓ํ //ɹ௨஌ͷड৴ొ࿥ʢupdateDataNotificationͷ௨஌Λड৴ͨ͠ΒɺupdateUIϝιουΛ࣮ߦʣ NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: .updateDataNotification, object: nil) // ௨஌ͷૹ৴ʢupdateDataNotificationͷ௨஌Λૹ৴ʣ NotificationCenter.default.post(name: .updateDataNotification, object: nil)

Slide 38

Slide 38 text

Model͔ΒView΁௨஌͢Δྫ class View { var model: Model = Model() init() { // ௨஌ͷड৴ొ࿥ʢupdateDataNotificationͷ௨஌Λड৴ͨ͠ΒɺupdateUIϝιουΛ࣮ߦʣ NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: .updateDataNotification, object: nil) } func receiveUIEvent() { model.updateData() } @objc func updateUI() { print("\(model.data)") } }

Slide 39

Slide 39 text

class Model { var data: Int = 0 func updateData() { data += 1 // ௨஌ͷૹ৴ʢupdateDataNotificationͷ௨஌Λૹ৴ʣ NotificationCenter.default.post(name: .updateDataNotification, object: nil) } }

Slide 40

Slide 40 text

௨஌ͷड৴ղআʹ͍ͭͯʢremoveObserverʣ • ௨஌ͷड৴ղআΛద੾ʹߦΘͳ͍ͱ։์͞ΕͨΦϒδΣΫτʹ ௨஌Λૹͬͯ͠·͏ʢ࣮ߦ࣌Ϋϥογϡʣ • iOS9Ҏ߱Ͱ͸deinit࣌ʹࣗಈͰ࣮ߦ // deinitͰͷड৴ղআ͸ෆཁ deinit { NotificationCenter.default.removeObserver(self, name: .updateDataNotification, object: nil) }

Slide 41

Slide 41 text

ิ଍:SelectorͰͷϝιου࣮ߦʹ͍ͭͯ Selector͸࣮ߦ࣌ʹݺͼग़͢ϝιου͕ܾఆ͢ΔɺObjective-Cํ ࣜͷಈతͳݺͼग़͠Λߦ͏ͨΊɺupdateUIϝιουʹ͸@objcଐੑ Λ͚ͭΔ @objc func updateUI() { print("\(model.data)") }

Slide 42

Slide 42 text

ϝϦσϝ • !௨஌໊Ͱ؆୯ʹ௨஌Λ࣮૷Ͱ͖Δʢ௨஌จࣈྻͷΈ͕Πϯλ ϑΣʔεͰૄ݁߹ʣ • !NରNͷ௨஌͕ඞཁͳ৔߹΍௨஌͍ͨ͠ΦϒδΣΫτؒʹ௚઀ ͷࢀরؔ܎͕ͳ͍৔߹ʹ༗ޮ • "ଟ༻͢ΔͱॲཧͷྲྀΕ͕௥͍ͮΒ͍ʢεύήοςΟϓϩάϥ ϜʹͳΔՄೳੑʣ

Slide 43

Slide 43 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 44

Slide 44 text

4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ • KVO͸ϓϩύςΟ஋ͷมԽΛ؂ࢹ͢Δ࢓૊Έ • Objective-CͷϥϯλΠϜػೳΛར༻͍ͯ͠ΔͨΊɺ؂ࢹର৅ͷ ΦϒδΣΫτ͸NSObjectΛཁܧঝ • Swift4Ͱ͸ɺϓϩύςΟมߋ࣌ͷॲཧΛΫϩʔδϟʔͰॻ͚Δ Α͏ʹͳΓɺΑΓ࢖͍΍͍͢

Slide 45

Slide 45 text

class View { var model: Model = Model() // ؂ࢹ༻ΦϒδΣΫτΛอ࣋͢Δ var observation: NSKeyValueObservation? init() { // modelͷdataϓϩύςΟΛKVOͰ؂ࢹ͢Δ observation = model.observe(\.data, options: [.new]) { model, change in // model.data͕มԽͨ͠৔߹ʹ࣮ߦ͞ΕΔΫϩʔδϟʔ if let newValue = change.newValue { print(newValue) } } } func receiveUIEvent() { model.updateData() } }

Slide 46

Slide 46 text

// NSObjectΛܧঝ class Model: NSObject { // @objcͱdynamicΛ͚ͭΔ @objc dynamic var data: Int = 0 func updateData() { data += 1 } }

Slide 47

Slide 47 text

ิ଍:dynamicΩʔϫʔυ • KVO͸Objective-CͷϥϯλΠϜػೳͰ͋ΔಈతσΟεύον ʢdynamic dispatchʣΛར༻ ʢ࣮ߦ࣌ʹಈతʹϓϩύςΟ͕ܾఆ͞ΕΔʣ • ΑͬͯϓϩύςΟʹ͸@objcͱdynamic͕ඞཁ @objc dynamic var data: Int = 0

Slide 48

Slide 48 text

ϝϦσϝ • !WebKitͷWKWebViewͷϓϩύςΟͷதʹ͸ɺtitle΍urlɺ estimatedProgressͳͲɺKVOʹରԠͨ͠ϓϩύςΟ(key-value observing compliant)͕͋ΓɺKVOͱ૬ੑ͕ྑ͍ • "ߏ଄ମʢstructʣ͸NSObjectΛܧঝ͢Δ͜ͱ͕Ͱ͖ͳ͍ͨ ΊɺKVO͸ར༻Ͱ͖ͳ͍

Slide 49

Slide 49 text

5ͭͷ௨஌ύλʔϯ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 50

Slide 50 text

5. Closure Callbackύλʔϯ ׬ྃޙͷॲཧΛΫϩʔδϟʔͰड͚औΓɺͦͷίʔϧόοΫ༻ͷ ΫϩʔδϟʔΛ࣮ߦ͢Δ͜ͱͰ௨஌͢Δύλʔϯ

Slide 51

Slide 51 text

Ϋϩʔδϟʔ͸ؔ਺ͷΦϒδΣΫτ // Ϋϩʔδϟʔͷྫ let isEqual: (_ a: Int, _ b: Int) -> Bool = { a, b in return a == b } // ()Ͱ࣮ߦ isEqual(1, 1) // true isEqual(1, 2) // false

Slide 52

Slide 52 text

class View { var model: Model = Model() func receiveUIEvent() { // ׬ྃޙͷॲཧΛΫϩʔδϟʔͰࢦఆ͢Δ // ຤ඌͷΫϩʔδϟʔͷҾ਺໊͸লུͰ͖Δʢtrailing closureه๏ʣ model.updateData { data in print(data) } } }

Slide 53

Slide 53 text

class Model { var data: Int = 0 // ׬ྃޙͷॲཧΛҾ਺ͷΫϩʔδϟʔͰड͚औ࣮ͬͯߦ͢Δ func updateData(completion: (_ data: Int) -> Void) { data += 1 completion(data) } }

Slide 54

Slide 54 text

ϝϦσϝ • !ݺͼग़͠ϝιουͷۙ͘ʹ׬ྃ࣌ͷॲཧΛॻ͚ΔͨΊɺίʔ υΛ௥͍΍͍͢ • "ͨͩ͠ෳ਺ͷඇಉظॲཧΛஞ࣮࣍ߦ͢Δ৔߹͸ɺΫϩʔδϟ ʔͷωετ͕ਂ͘ͳΒͳ͍Α͏ʹ஫ҙ func receiveUIEvent() { model.updateData(completion: { data in model.updateData(completion: { data in model.updateData(completion: { data in print(data) }) }) }) }

Slide 55

Slide 55 text

UIKitͰͷར༻ ྫ͑͹UIAlertControllerͷUIAlertAction͸μΠΞϩάλοϓ࣌ͷॲ ཧΛΫϩʔδϟʔͰࢦఆ let alertAction = UIAlertAction(title: "OK", style: .default) { handler in // OKϘλϯλοϓ࣌ͷॲཧ print("OK͕λοϓ͞Ε·ͨ͠") }

Slide 56

Slide 56 text

௨஌ύλʔϯͷൺֱͱ࢖͍෼͚ • ௨஌ͷύλʔϯ͸͜Ε͕Ұ൪ྑ͍ͱ͍͏΋ͷ͸ͳ͍ • ༻్ʹԠͯ͡ద੾ʹ௨஌ͷύλʔϯΛબ୒ • ·ͣ͸௨஌ݩͱ௨஌ઌͷ਺ͷؔ܎ʹԠͯ͡௨஌ͷύλʔϯΛબ ୒

Slide 57

Slide 57 text

·ͱΊ 1. ॥؀ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing: Ωʔ஋؂ࢹʣ 5. Closure Callbackύλʔϯ

Slide 58

Slide 58 text

௨஌ͷύλʔϯ ௨஌ݩͱ௨஌ઌͷ਺ ϝϦοτ σϝϦοτ Delegate 1ɿ1 ϓϩτίϧʹΑΓ࣮૷͢΂͖ ௨஌ΠϯλϑΣʔε͕໌֬ɻ ௨஌͢Δϝιου͕1ͭͷ৔ ߹͸ɺهड़ྔʹݟ߹Θͳ ͍ɻ Notification NɿN ௚઀ͷࢀর͕ͳ͍ΦϒδΣΫ τؒͰ΋௨஌͕ՄೳɻΦϒδ ΣΫτ͕ؒૄ݁߹ɻ ଟ༻͢Δͱॲཧ͕௥͍ͮΒ ͘ͳΔɻάϩʔόϧͳείʔ ϓͰ௨஌Λߦ͏ͨΊɺϓϩ άϥϚ͕ҙਤ͠ͳ͍ॲཧ͕ ಈ͍ͯ͠·͏Մೳੑ͕͋Δɻ KVO 1ɿN WKWebViewͳͲKVOʹରԠ ͨ͠Ϋϥεͱ૬ੑ͕ྑ͍ɻ Objective-CͷϥϯλΠϜ͕ඞ ཁɻߏ଄ମͰ͸ར༻Ͱ͖ͳ ͍ɻ Closure Callback 1ɿ1 ॲཧͷґཔ෦෼ͱ׬ྃޙͷ ॲཧΛۙ͘ʹॻ͘͜ͱ͕Ͱ ͖ɺՄಡੑ͕ߴ͍ɻ ωετ૿͑͗͢΍callbackϝ ιουଟ͗͢ͰՄಡੑ☓ɻ

Slide 59

Slide 59 text

SwiftͱΦϒδΣΫτؒͷ௨஌ͷύλʔϯ ͓ΘΓ