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
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
330
Property Wrappers
shtnkgm
0
380
Saliency Detection
shtnkgm
0
91
パフォーマンス改善とユニットテスト
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
APNsからLive Activityを開始する話
yumnumm
0
170
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
110
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
310
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.2k
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
180
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
最近”作らせてる” ローカルAIアプリの話
akit37
0
490
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
830
golang-bob.pdf
iwatsukayura
0
130
Performance Optimization With LLMs
xleitix
0
180
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
Darren the Foodie - Storyboard
khoart
PRO
4
4k
The Language of Interfaces
destraynor
162
27k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
720
We Are The Robots
honzajavorek
0
400
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
The World Runs on Bad Software
bkeepers
PRO
72
12k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
HDC tutorial
michielstock
2
970
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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ͱΦϒδΣΫτؒͷ௨ͷύλʔϯ ͓ΘΓ