Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
Search
shtnkgm
February 20, 2018
Programming
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
shtnkgm
February 20, 2018
More Decks by shtnkgm
See All by shtnkgm
Combine入門
shtnkgm
2
320
Property Wrappers
shtnkgm
0
370
Saliency Detection
shtnkgm
0
86
パフォーマンス改善とユニットテスト
shtnkgm
4
1.7k
iOSのコードベースレイアウト
shtnkgm
2
830
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
120
SwiftとFunctional Reactive Programming
shtnkgm
0
200
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
120
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
shtnkgm
0
140
Other Decks in Programming
See All in Programming
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
350
3Dシーンの圧縮
fadis
1
740
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
560
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
330
Oxlintのカスタムルールの現況
syumai
6
1.1k
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
dRuby over BLE
makicamel
2
330
Oxcを導入して開発体験が向上した話
yug1224
4
310
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
220
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Balancing Empowerment & Direction
lara
6
1.2k
Agile that works and the tools we love
rasmusluckow
331
21k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Become a Pro
speakerdeck
PRO
31
6k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
A Soul's Torment
seathinner
6
2.9k
How to Think Like a Performance Engineer
csswizardry
28
2.6k
New Earth Scene 8
popppiees
3
2.3k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
300
Transcript
SwiftͱΦϒδΣΫτؒͷ௨ͷύλʔϯ 2018/2/20 @shtnkgm
͢͜ͱ SwiftͱΦϒδΣΫτؒͷ௨ͷύλʔϯʹ͍ͭͯߟ͑·͢ 1. ௨ํ๏ͷઃܭʹ͍ͭͯ 2. ΞϯνύλʔϯΛؚΊͨҎԼͷ5ͭͷ௨ύλʔϯ 3. ύλʔϯͷൺֱͱ͍͚ʹ͍ͭͯ
௨ͱ ΦϒδΣΫτؒͷʮ௨ʯͱΦϒδΣΫτؒͷϝοηʔδͷ ΓͱΓΛҙຯ͠·͢ɻ
ͳͥ௨ํ๏ͷઃܭ͕ඞཁ͔ • ͳίʔυͷഉআɺ࠶ར༻ੑ্͍ͤͨ͞ • ίʔυΛʹԠͯ͡ෳͷΦϒδΣΫτׂ͍ͨ͠ • ෳͷΦϒδΣΫτΛѻ͏ͨΊɺͦͷ௨ํ๏ͷઃܭ͕ඞཁ
ྫɿViewͱModel Modelͷσʔλߋ৽ͷྃΛViewͲͷΑ͏ʹ௨͢Δʁ ※PrensenterViewModelͳͲΞʔΩςΫνϟͷ͜͜Ͱߟ͑ͳ͍ͷͱ͠·͢ɻ
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ ※SwiftͰඪ४αϙʔτ͞Ε͍ͯͳ͍ɺRxSwiftBondͳͲͷσʔλόΠϯσΟϯάύλʔϯର֎
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ • ผΦϒδΣΫτͷϝιουΛ࣮ߦ͢ΔʹɺͦͷΦϒδΣΫτ ͷࢀরΛ͍࣋ͬͯΕྑ͍ • ͭ·ΓΦϒδΣΫτؒͰ૬ޓʹ௨Λ͢Δʹ͓ޓ͍ͷࢀরΛ ͍࣋ͬͯΕྑ͍
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)") } }
class Model { // ˒ ViewΦϒδΣΫτͷࢀর var view: View? var
data: Int = 0 // 3. σʔλͷߋ৽ func updateData() { data += 1 // 4. Viewσʔλͷߋ৽ྃΛ௨ view?.updateUI() } }
͜ͷίʔυಈ͚͘Ͳ...
॥ࢀর͕͋Δ • ਖ਼ৗʹಈ࡞͢Δ͕ɺʮ॥ࢀরʯ(strong reference cycle)ͱ͍ ͏͋Γ • ࢀর͕ؔ॥͍ͯ͠Δ߹ɺΦϒδΣΫτϝϞϦ͔Βղ์ ͞Εͳ͍ʢ=ϝϞϦϦʔΫʣ •
ϝϞϦϦʔΫ͕૿͑ΔͱύϑΥʔϚϯε͕མͪɺ࠷ѱΞϓϦ͕ Ϋϥογϡ͢Δ
ิ: iOSͷϝϞϦཧํࣜʹ͍ͭͯʢ1/2ʣ • iOSͰϝϞϦཧΛࢀরΧϯλ(Reference Counting)ͱ͍͏ ํࣜͰߦ͍ͬͯΔ • ࢀর͞ΕΔ͝ͱʹ+1ɺࢀর͕ͳ͘ͳͬͨ࣌Ͱ-1
ิ: iOSͷϝϞϦཧํࣜʹ͍ͭͯʢ2/2ʣ • ࢀরΦϒδΣΫτ͕ͳ͍߹ɺࢀরΧϯλ͕0ʹͳΔ • OSͦͷΦϒδΣΫτΛϝϞϦ͔Β։์ͯ͠ྑ͍ͱஅ
॥ࢀরύλʔϯΛվળ͍ͨ͠
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ • weakΩʔϫʔυΛ͚ͭΔ͜ͱͰɺʮऑࢀরʯʢweak referenceʣ͢Δ • ௨ৗͷʮڧࢀরʯͱҟͳΓɺࢀরΧϯλ͕૿͑ͳ͍
ऑࢀরͷϓϩύςΟͰࢀরઌͷΦϒδΣΫτ͕ղ์͞Εɺnil͕ ೖ͞ΕΔՄೳੑ͕͋ΔͨΊɺΦϓγϣφϧܕͰఆٛ // weakΩʔϫʔυͰऑࢀর weak var view: View?
॥ࢀরղܾͨ͠
·ͩվྑͷ༨͋Γ • ViewͱModel͕ʮີ݁߹ʯ(tight coupling)Ͱ͋Δ • ີ݁߹ͳઃܭมߋʹऑ͘ɺ࠶ར༻ͮ͠Β͍ • ͜͜Ͱݴ͏มߋʹऑ͍ͱ͍͏ͷɺ༷มߋ͕ೖͬͨ߹ʹม ߋՕॴ͕ଟ͘ͳΔͱ͍͏ҙຯ
SecondView͕ModelΛ͏༷มߋΛఆ class Model { // View → SecondViewʹมߋ͕ඞཁʢModelViewʹґଘ͍ͯ͠Δʣ weak var
view: View? var data: Int = 0 func updateData() { data += 1 view?.updateUI() } }
ີ݁߹ͷղܾ • Model͕Viewʹґଘ͠ͳ͍ॻ͖ํʹ͢Δ • ΑΓநతͳΠϯλϑΣʔεʹґଘͤ͞ΔΑ͏ʹ͢Δ • Model͕ඞཁͱ͢ΔநతͳΠϯλϑΣʔεͱԿ͔
நతͳΠϯλϑΣʔε • ʮupdateUIϝιου͕࣮ߦͰ͖Δ͜ͱʯͷΈ • updateUIϝιου͕࣮ߦͰ͖ΔΫϥεͰ͋ΕͲΜͳΫϥεͰ ྑ͍ • ͜ͷநతͳΠϯλϑΣʔεΛද͢ํ๏ͷ1ͭͱͯ͠ɺSwiftͰ ϓϩτίϧ͕͋Δ ʢJavaʹ͓͚Δinterfaceʹ͍ۙ֓೦ʣ
updateUIϝιουΛ࣋ͭͱ͍͏֓೦ΛϓϩτίϧͰ࣮ // ViewProtocolʹ४ڌ͢ΔܕupdateUI()ͱ͍͏ϝιουΛ࣋ͭ protocol ViewProtocol { func updateUI() }
ϓϩτίϧ͕ܕͱͯ͠ѻ͑Δ • ΠϯελϯεԽͰ͖ͳ͍͕ɺܕͱͯ͠ѻ͑Δ protocol ViewProtocol: class { func updateUI() }
class Model { // ViewͰͳ͘ViewProtocolʹґଘ weak var view: ViewProtocol? var data: Int = 0 func updateData() { data += 1 view?.updateUI() } }
۩ΫϥεΛϓϩτίϧʹ४ڌͤ͞Δ // ViewProtocolʹ४ڌ͢Δ͜ͱΛએݴ class View: ViewProtocol { var model: Model
= Model() func receiveUIEvent() { model.view = self model.updateData() } // ViewProtocolʹ४ڌͨ͠ϝιου func updateUI() { print("\(model.data)") } }
ิ: Class-Only Protocols protocol ViewProtocol: class { func updateUI() }
্هͷίʔυྫͰɺViewProtocolclassΛܧঝ͍ͤͯ͞·͢ɻ classΛܧঝ͢ΔͱɺͦͷϓϩτίϧΫϥεʹ͔͠ద༻Ͱ͖ͳ͘ ͳΓ·͢ɻ
ͳͥclassܧঝ͕ඞཁ͔ • ModelͷviewϓϩύςΟweakʢऑࢀরʣͰఆٛ͞Ε͍ͯΔͨ ΊɺΫϥεʢࢀরܕʣͰ͋Δඞཁ͋Γ ʢߏମྻڍମܕͰ͋ΔͨΊNGʣ • ViewProtocol͕ΫϥεʢࢀরܕʣͰ͋Δ͜ͱΛ໌ࣔ͢ΔͨΊʹ classΛܧঝ͢Δ class Model
{ // weak͕͍͍ͭͯΔͷͰViewProtocolࢀরܕͰ͋Δඞཁ͕͋Δ weak var view: ViewProtocol?
ґଘؔΛղফͰ͖ͨ • ͜ΕͰModel͕Viewʹґଘ͠ͳ͍ίʔυʹͳͬͨ • ͜ΕʮϙϦϞʔϑΟζϜʯͷҰྫʹͳ͍ͬͯΔ ʢϓϩτίϧ͕ϙϦϞʔϑΟζϜͷ࣮ݱखஈͷͻͱͭʣ
ϙϦϞʔϑΟζϜʢpolymorphism: ଟଶੑʣ ಈతʹϝιουʹΑͬͯݺͼग़͞ΕΔΦϒδΣΫτ͕มΘΓɺͦ ͷΦϒδΣΫτʹΑͬͯৼΔ͍͕มΘΔͱ͍͏ੑ࣭
ࠓճͷྫͱϙϦϞʔϑΟζϜ • ModelviewϓϩύςΟʹର͠updateUIϝιουΛ࣮ߦ • viewϓϩύςΟ͕Viewͳͷ͔SecondViewͳͷ͔Βͳ͍ ʢviewϓϩύςΟ͕ෳͷܕʹͳΓ͏Δ:ϙϦϞʔϑΟζϜʣ • ࣮ߦΦϒδΣΫτʹΑͬͯupdateUIϝιουͷ࣮͕ҟͳΔ ʢViewΛߋ৽ or
SecondViewΛߋ৽ʣ
UIKitͱσϦήʔτύλʔϯ • UIKitϑϨʔϜϫʔΫͰUITableViewDelegateɺ UIPickerViewDelegateͳͲଟ͘ͷΦϒδΣΫτͰ͜ͷύλʔ ϯΛ࠾༻ • σϦήʔτύλʔϯʹ͓͚ΔϙϦϞʔϑΟζϜͷੑ࣭Λ׆͔͢ ͜ͱͰɺ࠶ར༻ੑͷߴ͍UI෦Λఏڙ
ϝϦσϝ • !ϓϩτίϧʹΑΓ࣮͖͢ϝιου͕໌֬ • "௨৴ྃͷ௨ͷΈͳͲɺγϯϓϧͳ௨ͷ߹ʹهड़ί ετͱݟ߹Θͳ͍ (σϦήʔτϓϩύςΟͷ࣮ɺϓϩτίϧఆٛɺϓϩτίϧ ͷ४ڌ) • "Մಡੑ͕ൺֱత͍
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
3. NotificationCenterύλʔϯ • NotificationCenterΫϥεΛར༻ͨ͠௨ͷύλʔϯ • NotificationCenterड৴ొͨ͠ΦϒδΣΫτʹର͠ใΛϒ ϩʔυΩϟετ͢Δ • ௨ΠϯλϑΣʔε௨໊ʢจࣈྻʣͷΈ •
ಉ͡௨໊ΛผͷΦϒδΣΫτ͔Βૹ৴Ͱ͖ΔͨΊɺଟରଟ ͷ௨Λ࣮ݱ
NotificationCenterͷTips ௨໊Notification.NameΛextensionͰ֦ு͠ɺstaticϓϩύς ΟͰఆ͓ٛͯ͘͠ͱར༻͍͢͠ // ௨໊Λొ extension Notification.Name { static let
updateDataNotification = Notification.Name("updateDataNotification") }
ड৴ొ / ૹ৴ͷํ //ɹ௨ͷड৴ొʢupdateDataNotificationͷ௨Λड৴ͨ͠ΒɺupdateUIϝιουΛ࣮ߦʣ NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: .updateDataNotification, object:
nil) // ௨ͷૹ৴ʢupdateDataNotificationͷ௨Λૹ৴ʣ NotificationCenter.default.post(name: .updateDataNotification, object: nil)
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)") } }
class Model { var data: Int = 0 func updateData()
{ data += 1 // ௨ͷૹ৴ʢupdateDataNotificationͷ௨Λૹ৴ʣ NotificationCenter.default.post(name: .updateDataNotification, object: nil) } }
௨ͷड৴ղআʹ͍ͭͯʢremoveObserverʣ • ௨ͷड৴ղআΛదʹߦΘͳ͍ͱ։์͞ΕͨΦϒδΣΫτʹ ௨Λૹͬͯ͠·͏ʢ࣮ߦ࣌Ϋϥογϡʣ • iOS9Ҏ߱Ͱdeinit࣌ʹࣗಈͰ࣮ߦ // deinitͰͷड৴ղআෆཁ deinit {
NotificationCenter.default.removeObserver(self, name: .updateDataNotification, object: nil) }
ิ:SelectorͰͷϝιου࣮ߦʹ͍ͭͯ Selector࣮ߦ࣌ʹݺͼग़͢ϝιου͕ܾఆ͢ΔɺObjective-Cํ ࣜͷಈతͳݺͼग़͠Λߦ͏ͨΊɺupdateUIϝιουʹ@objcଐੑ Λ͚ͭΔ @objc func updateUI() { print("\(model.data)") }
ϝϦσϝ • !௨໊Ͱ؆୯ʹ௨Λ࣮Ͱ͖Δʢ௨จࣈྻͷΈ͕Πϯλ ϑΣʔεͰૄ݁߹ʣ • !NରNͷ௨͕ඞཁͳ߹௨͍ͨ͠ΦϒδΣΫτؒʹ ͷࢀর͕ؔͳ͍߹ʹ༗ޮ • "ଟ༻͢ΔͱॲཧͷྲྀΕ͕͍ͮΒ͍ʢεύήοςΟϓϩάϥ ϜʹͳΔՄೳੑʣ
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
4. KVOύλʔϯʢKey-Value Observing: Ωʔࢹʣ • KVOϓϩύςΟͷมԽΛࢹ͢ΔΈ • Objective-CͷϥϯλΠϜػೳΛར༻͍ͯ͠ΔͨΊɺࢹରͷ ΦϒδΣΫτNSObjectΛཁܧঝ •
Swift4ͰɺϓϩύςΟมߋ࣌ͷॲཧΛΫϩʔδϟʔͰॻ͚Δ Α͏ʹͳΓɺΑΓ͍͍͢
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() } }
// NSObjectΛܧঝ class Model: NSObject { // @objcͱdynamicΛ͚ͭΔ @objc dynamic
var data: Int = 0 func updateData() { data += 1 } }
ิ:dynamicΩʔϫʔυ • KVOObjective-CͷϥϯλΠϜػೳͰ͋ΔಈతσΟεύον ʢdynamic dispatchʣΛར༻ ʢ࣮ߦ࣌ʹಈతʹϓϩύςΟ͕ܾఆ͞ΕΔʣ • ΑͬͯϓϩύςΟʹ@objcͱdynamic͕ඞཁ @objc dynamic
var data: Int = 0
ϝϦσϝ • !WebKitͷWKWebViewͷϓϩύςΟͷதʹɺtitleurlɺ estimatedProgressͳͲɺKVOʹରԠͨ͠ϓϩύςΟ(key-value observing compliant)͕͋ΓɺKVOͱ૬ੑ͕ྑ͍ • "ߏମʢstructʣNSObjectΛܧঝ͢Δ͜ͱ͕Ͱ͖ͳ͍ͨ ΊɺKVOར༻Ͱ͖ͳ͍
5ͭͷ௨ύλʔϯ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
5. Closure Callbackύλʔϯ ྃޙͷॲཧΛΫϩʔδϟʔͰड͚औΓɺͦͷίʔϧόοΫ༻ͷ ΫϩʔδϟʔΛ࣮ߦ͢Δ͜ͱͰ௨͢Δύλʔϯ
ΫϩʔδϟʔؔͷΦϒδΣΫτ // Ϋϩʔδϟʔͷྫ let isEqual: (_ a: Int, _ b:
Int) -> Bool = { a, b in return a == b } // ()Ͱ࣮ߦ isEqual(1, 1) // true isEqual(1, 2) // false
class View { var model: Model = Model() func receiveUIEvent()
{ // ྃޙͷॲཧΛΫϩʔδϟʔͰࢦఆ͢Δ // ඌͷΫϩʔδϟʔͷҾ໊লུͰ͖Δʢtrailing closureه๏ʣ model.updateData { data in print(data) } } }
class Model { var data: Int = 0 // ྃޙͷॲཧΛҾͷΫϩʔδϟʔͰड͚औ࣮ͬͯߦ͢Δ
func updateData(completion: (_ data: Int) -> Void) { data += 1 completion(data) } }
ϝϦσϝ • !ݺͼग़͠ϝιουͷۙ͘ʹྃ࣌ͷॲཧΛॻ͚ΔͨΊɺίʔ υΛ͍͍͢ • "ͨͩ͠ෳͷඇಉظॲཧΛஞ࣮࣍ߦ͢Δ߹ɺΫϩʔδϟ ʔͷωετ͕ਂ͘ͳΒͳ͍Α͏ʹҙ func receiveUIEvent() {
model.updateData(completion: { data in model.updateData(completion: { data in model.updateData(completion: { data in print(data) }) }) }) }
UIKitͰͷར༻ ྫ͑UIAlertControllerͷUIAlertActionμΠΞϩάλοϓ࣌ͷॲ ཧΛΫϩʔδϟʔͰࢦఆ let alertAction = UIAlertAction(title: "OK", style: .default)
{ handler in // OKϘλϯλοϓ࣌ͷॲཧ print("OK͕λοϓ͞Ε·ͨ͠") }
௨ύλʔϯͷൺֱͱ͍͚ • ௨ͷύλʔϯ͜Ε͕Ұ൪ྑ͍ͱ͍͏ͷͳ͍ • ༻్ʹԠͯ͡దʹ௨ͷύλʔϯΛબ • ·ͣ௨ݩͱ௨ઌͷͷؔʹԠͯ͡௨ͷύλʔϯΛબ
·ͱΊ 1. ॥ࢀরύλʔϯʢΞϯνύλʔϯʣ 2. Delegateύλʔϯʢऑࢀর+ϙϦϞʔϑΟζϜʣ 3. NotificationCenterύλʔϯ 4. KVOύλʔϯʢKey-Value Observing:
Ωʔࢹʣ 5. Closure Callbackύλʔϯ
௨ͷύλʔϯ ௨ݩͱ௨ઌͷ ϝϦοτ σϝϦοτ Delegate 1ɿ1 ϓϩτίϧʹΑΓ࣮͖͢ ௨ΠϯλϑΣʔε͕໌֬ɻ ௨͢Δϝιου͕1ͭͷ ߹ɺهड़ྔʹݟ߹Θͳ
͍ɻ Notification NɿN ͷࢀর͕ͳ͍ΦϒδΣΫ τؒͰ௨͕ՄೳɻΦϒδ ΣΫτ͕ؒૄ݁߹ɻ ଟ༻͢Δͱॲཧ͕͍ͮΒ ͘ͳΔɻάϩʔόϧͳείʔ ϓͰ௨Λߦ͏ͨΊɺϓϩ άϥϚ͕ҙਤ͠ͳ͍ॲཧ͕ ಈ͍ͯ͠·͏Մೳੑ͕͋Δɻ KVO 1ɿN WKWebViewͳͲKVOʹରԠ ͨ͠Ϋϥεͱ૬ੑ͕ྑ͍ɻ Objective-CͷϥϯλΠϜ͕ඞ ཁɻߏମͰར༻Ͱ͖ͳ ͍ɻ Closure Callback 1ɿ1 ॲཧͷґཔ෦ͱྃޙͷ ॲཧΛۙ͘ʹॻ͘͜ͱ͕Ͱ ͖ɺՄಡੑ͕ߴ͍ɻ ωετ૿͑͗͢callbackϝ ιουଟ͗͢ͰՄಡੑ☓ɻ
SwiftͱΦϒδΣΫτؒͷ௨ͷύλʔϯ ͓ΘΓ