Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
shtnkgm
February 20, 2018
Programming
180
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
330
Property Wrappers
shtnkgm
0
380
Saliency Detection
shtnkgm
0
92
パフォーマンス改善とユニットテスト
shtnkgm
4
1.8k
iOSのコードベースレイアウト
shtnkgm
2
850
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
130
SwiftとFunctional Reactive Programming
shtnkgm
0
210
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
130
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
shtnkgm
0
140
Other Decks in Programming
See All in Programming
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
290
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.2k
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
920
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.6k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
600
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
250
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
330
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
300
ActionController meets Protocol Buffers
sorah
1
790
Seven New Principles of Software Engineering
yegor256
0
460
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.3k
Abbi's Birthday
coloredviolet
4
11k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Side Projects
sachag
456
43k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
610
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
60k
Embracing the Ebb and Flow
colly
88
5.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Cost Of JavaScript in 2023
addyosmani
56
10k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
830
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ͱΦϒδΣΫτؒͷ௨ͷύλʔϯ ͓ΘΓ