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
840
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
130
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
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
190
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
120
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
270
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
9
5.8k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
730
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
120
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.3k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
170
Build-to-own AI: Agentic Development for Humans
inesmontani
PRO
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
300
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
The Language of Interfaces
destraynor
162
27k
Color Theory Basics | Prateek | Gurzu
gurzu
0
400
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Git: the NoSQL Database
bkeepers
PRO
432
67k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Building an army of robots
kneath
306
46k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
670
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
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ͱΦϒδΣΫτؒͷ௨ͷύλʔϯ ͓ΘΓ