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
パフォーマンス改善とユニットテスト
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shtnkgm
March 26, 2019
Programming
1.8k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
パフォーマンス改善とユニットテスト
Bonfire iOS #5 発表資料
shtnkgm
March 26, 2019
More Decks by shtnkgm
See All by shtnkgm
Combine入門
shtnkgm
2
330
Property Wrappers
shtnkgm
0
380
Saliency Detection
shtnkgm
0
90
iOSのコードベースレイアウト
shtnkgm
2
840
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
20180220_iOSLT_Swiftとオブジェクト間の通知のパターン
shtnkgm
0
170
Other Decks in Programming
See All in Programming
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
790
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
170
カツオ、ご期待ください
suneo3476
0
180
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
4.9k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
150
mrbgem 三角測量 開発
ogom
0
240
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
170
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
0
190
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
260
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
370
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
810
Building the Perfect Custom Keyboard
takai
2
900
Unsuck your backbone
ammeep
672
58k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
260
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Amusing Abliteration
ianozsvald
1
340
Optimising Largest Contentful Paint
csswizardry
37
4k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
590
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
エンジニアに許された特別な時間の終わり
watany
109
250k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Transcript
#POpSFJ04ʛ!TIUOLHN ύϑΥʔϚϯεվળͱϢχοτςετ
4IPUB/BLBHBNJ ϠϑʔגࣜձࣾʛΤϯδχΞ !TIUOLHN
:BIPPγϣοϐϯά
wJ04ΞϓϦϦϦʔε wίʔυن wϢχοτςετ w୲J04ΤϯδχΞ ɿʙ ɿສߦʢ0CKFDUJWF$ɿʣ ɿ݅ʢΧόϨοδɿʣ ɿ໊ʢ Ћʣ
ݱࡏͷׂ w ύϑΥʔϚϯεվળ w ٕज़తෛ࠴ͷղফ w ։ൃޮͷվળ ʢGBTUMBOFɺ4XJGU-JOUɺ%BOHFSɺ4XJGU(FOɺ4DSFXESJWFSDEɺ1FSJQIFSZʣ ػೳ։ൃ νʔϜ
ٕज़վળ νʔϜ
ࠓ͍ͨ͜͠ͱ
:BIPPγϣοϐϯάΞϓϦͷ ύϑΥʔϚϯεվળͱ Ϣχοτςετ׆༻ͷ
˞ܭଌࣗࣾௐ 501ը໘ ΞϓϦىಈʙදࣔ·Ͱͷվળ #FGPSFɿฏۉඵ
ΞϓϦىಈʙදࣔ·Ͱͷվળ #FGPSFɿฏۉඵ ˞ܭଌࣗࣾௐ ݮ 501ը໘ "GUFSɿฏۉඵ
None
ϘτϧωοΫՕॴͷௐࠪ
"1*௨৴Ͱ ಈతʹมΘΔλϒϝχϡʔ
ىಈ͔Β501දࣔ·ͰͷྲྀΕ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ
ىಈ "1*௨৴ "1*௨৴ λϒදࣔ 501දࣔ λϒՃ
ํ0,ɺͰ
ϓϩάϥϜͷෳࡶ͕૿͢ ฒྻԽඇಉظԽʹΑΓ
վमରͷΫϥε͕طʹෳࡶ
վमରͷΫϥεΛͳ͕ΊΔ w ॳظ࣮͔Βܦ͍ͬͯΔ w मਖ਼ͷܧ͗͠ʹΑΔ'BU7$ʢߦPWFSʣ w 7JFXϏδωεϩδοΫ͕ࠞࡏ͠ɺաଟ w Ϣχοτςετ΄΅ͳ͠
Ͳ͏͢Δʁ
طଘΫϥε 'BU7$
طଘΫϥε Ճ ❌͞ΒʹංେԽ Ճ
طଘΫϥε Ϋϥε Ϋϥε Ϋϥε খ͘͞Γग़͠
طଘΫϥε Ϋϥε Ϋϥε Ϋϥε ฒྻԽॲཧ ඇಉظԽॲཧ
Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ Ϣχοτςετ
Ϋϥε Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ґଘΫϥεΛ֎෦͔Βઃఆ ʢ%FQFOEFODZ*OKFDUJPOʣ *OKFDU
*OKFDU
.PDL Ϋϥε .PDL Ϋϥε Ϋϥε طଘΫϥε ✅ ✅ ✅ ✅
্ҐϨΠϠʔ Ϣχοτςετ
͏গ͠۩ମతʹ w λϒϝχϡʔͷදࣔϩδοΫΛΓग़͠ɺ 4UBDL7JFXԽ w ঢ়ଶཧͱ௨৴ϩδοΫΛΓग़͠ w λϒͷछྨΛFOVNͰ࠶ཧʜͳͲ
7JFXϨΠϠʔͷϢχοτςετ
ॻ͖ʹ͍͕͘ɺ ෆ͕҆͋Εॻ͘
7JFXͷςετ͕ॻ͖ʹ͍͘ཧ༝ w νΣοΫର͕7JFXͷදࣔͱͳΔͨΊɺग़ྗΛऔಘͮ͠Β͍ ʢ҉తͳग़ྗͷνΣοΫʣ w 6*,JUͷϥΠϑαΠΫϧʹԊͬͯදࣔྃΛͭ ʢඇಉظςετʣ
// Tips: ΞΫηεम০ࢠΛมߋ͢Δ // before @IBOutlet private weak var titleLabel:
UILabel! // after @IBOutlet private(set) weak var titleLabel: UILabel!
// Tips: subviews͔ΒಛఆΫϥεViewͷΈΛऔಘ͢Δ let labels = view.findViews(subclassOf: UILabel.self) let tabViews
= view.findViews(subclassOf: TabView.self) extension UIView { var recursiveSubviews: [UIView] { return subviews + subviews.flatMap { $0.recursiveSubviews } } func findViews<T: UIView>(subclassOf: T.Type) -> [T] { return recursiveSubviews.compactMap { $0 as? T } } }
// Tips: දࣔྃͷػ func waitUntil(condition: () -> Bool) { while
!condition() { RunLoop.main.run(until: Date(timeIntervalSinceNow: 0.001)) } }
7JFXͷϢχοτςετΛ ॻ͍ͯΑ͔ͬͨ͜ͱ
Ϣχοτςετ͕௨Βͳ͍ λϒͷ͕ظ௨ΓʹͳΒͳ͍ ❌
खಈςετͰҰݟਖ਼͍͠
%FCVH7JFX)JFSBSDIZ
None
None
None
None
ݪҼ 6*4UBDL7JFXͷαϒϏϡʔͷআͷํ
6*4UBDL7JFXͰλϒΛཧ λϒͷՃɿBEE"SSBOHFE4VCWJFX @ λϒͷআɿSFNPWF"SSBOHFE4VCWJFX @
// arrangedSubviewsΛআ stackView.arrangedSubviews .forEach { stackView.removeArrangedSubview($0) } // subviewsΛআ stackView.subviews
.forEach { $0.removeFromSuperview() }
7JFXͷϢχοτςετͰ खಈςετͰؾ͖ͮʹ͍͘ ʹؾ͚ͮͨ
ৼΓฦΓ
w ϢχοτςετΛॻ͖ͳ͕ΒϦϑΝΫλͯ͠ ࠓޙϝϯς͍͢͠ίʔυʹ w खಈςετͰͷखΓ͕࠷খݶ ʢόάΛઌग़͠Ͱݕग़ʣ (
w ϩάૹ৴͍ͯ͠Δσʔλͷத͕Ұ෦ܽଛ w ϢχοτςετɺखಈςετͰݕͰ͖ͣ )
ߴԽ͗ͯ͢͠લఏ่͕݅ΕΔ w ߴԽલλΠϛϯά͕͔ͬͨͷͰɺਖ਼͘͠ಈ࡞ w ϩάૹ৴ͷλΠϛϯά͕ૣ͘ͳΓɺ ඞཁͳσʔλ͕औΕͯͳ͍ͷʹϩάૹ৴ ૹ৴σʔλͷऔಘ ϩάૹ৴˓ ϩάૹ৴º ߴԽ
Ϟδϡʔϧؒͷ҉తͳґଘؔ ϢχοτςετͰؾ͖ͮʹ͍͘
func sendLog() { assert(analyticsData.foo != nil, "foo͕औಘͰ͖͍ͯΔ͜ͱ") logger.sendLog() }
·ͱΊ
·ͱΊ w ύϑΥʔϚϯεվળͱϦϑΝΫλϦϯά Ͱ͖ΕηοτͰ w खಈςετͰؾ͚ͮͳ͍ෆ۩߹ʹ 7JFXͷςετͰؾ͚ͮͨ w Ϣχοτςετ͚ͩͰͳ͘"TTFSUJPO׆༻
͋Γ͕ͱ͏͍͟͝·ͨ͠ #POpSFJ04ʛ!TIUOLHN