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
89
パフォーマンス改善とユニットテスト
shtnkgm
4
1.8k
iOSのコードベースレイアウト
shtnkgm
2
840
20190117_iOSLT_CBLinSwift.pdf
shtnkgm
0
130
SwiftとFunctional Reactive Programming
shtnkgm
0
200
20180710_iOSLT_iOSでDarkModeを実装する
shtnkgm
0
130
20180410_iOSLT_SwiftとProtocol-OrientedProgramming
shtnkgm
0
140
Other Decks in Programming
See All in Programming
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
280
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
770
新卒PdEのリアル
ryu1013
1
480
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
260
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
430
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
110
Hono + Inertia + React で LP を構築した話
oukayuka
2
220
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
500
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
360
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
202
76k
Automating Front-end Workflow
addyosmani
1369
210k
Utilizing Notion as your number one productivity tool
mfonobong
4
580
Making the Leap to Tech Lead
cromwellryan
135
10k
Mobile First: as difficult as doing things right
swwweet
225
10k
Building the Perfect Custom Keyboard
takai
2
870
Designing for Timeless Needs
cassininazir
1
470
Producing Creativity
orderedlist
PRO
348
41k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
410
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ͱΦϒδΣΫτؒͷ௨ͷύλʔϯ ͓ΘΓ