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
Self-Documenting のススメ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Elvis Shi
September 20, 2018
Programming
1.1k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Self-Documenting のススメ
Elvis Shi
September 20, 2018
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
590
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
590
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
170
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
410
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
800
How did I build an Open-Source SwiftUI Toast Library
lovee
1
190
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
1.3k
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
390
Observation のあれこれ / A brief introduction about Observation
lovee
3
460
Other Decks in Programming
See All in Programming
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
230
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
1.8k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.2k
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
5.2k
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
250
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
210
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.8k
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
230
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
8.8k
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
Featured
See All Featured
Docker and Python
trallard
47
4.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1.1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
390
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
Typedesign – Prime Four
hannesfritz
42
3.2k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
350
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
530
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
670
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Transcript
4FMG%PDVNFOUJOH$PEF ͷεεϝ forJ04%$3FKFDU$POGFSFODFEBZT
rܙྤ lզʑΤϯδχΞେͬݏ͍ͳ͜ͱ͕Cͭ͋Δ CͭυΩϡϝϯτΛॻ͘͜ͱɻ CͭυΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ ίʔυΛอक͢Δ͜ͱͩɻz
rܙྤ lզʑΤϯδχΞେͬݏ͍ͳ͜ͱ͕Cͭ͋Δ CͭυΩϡϝϯτΛॻ͘͜ͱɻ CͭυΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ ίʔυΛอक͢Δ͜ͱͩɻz
rܙྤ lզʑΤϯδχΞେͬݏ͍ͳ͜ͱ͕Cͭ͋Δ CͭυΩϡϝϯτΛॻ͘͜ͱɻ CͭυΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ ίʔυΛอक͢Δ͜ͱͩɻz ʊਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹͩͬͨΒ࠷ॳ͔ΒυΩϡϝϯτͱͯ͠ɹʻ ʼɹ͑ΔίʔυΛॻ͚ສࣄղܾͳͷͰ
ɹʻ ʉ:?:?:?:?:?:?:?:?::?:?:?:?:?:?:?:?:ʉ
} var employedBy = "YUMEMI Inc." var job = "iOS
Developer" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ iOSDC 2018 CfP શ෦མͪͨਏ͍ """ class Me: Developable, Talkable {
໔આ໌ w "͜ͷτʔΫίʔσΟϯάνοϓεతͳͰ͋Δ w #͜ͷτʔΫυΩϡϝϯτࣗಈੜͷͰͳ͍
rӳࣙ l4FMGEPDVNFOUJOHDPEFɿࣗݾจॻԽίʔυz
let s = (0 ..< 50) .map({ _ in Int.random(in:
0 ... 100) }) .filter({ $0 >= 60 }) .reduce(0, +)
let s = (0 ..< 50) .map({ _ in Int.random(in:
0 ... 100) }) .filter({ $0 >= 60 }) .reduce(0, +)
private extension Int { var isPassed: Bool { return self
>= 60 } } let numberOfStudents = 50 let studentsScoreList = (0 ..< numberOfStudents) .map({ _ -> Int in let score = Int.random(in: 0 ... 100) return score }) let passedStudentsScoreList = studentsScoreList .filter({ $0.isPassed }) let totalScoreOfAllPassedStudents = passedStudentsScoreList .reduce(0, +) ͳΔ΄Ͳɺςετʹ߹֨ͨ͠ੜెͷ ͷ߹ܭͶʂ
rܙྤ l4FMGEPDVNFOUJOHDPEFɿࣗࣗͷҙຯΛ ͖ͪΜͱઆ໌Ͱ͖͍ͯΔίʔυz
ͳͥ4FMG%PDVNFOUJOH$PEFʁ w ಉ͜͡ͱΛʮίʔυʯͱʮυΩϡϝϯτʯ྆ํͰॻ͘ ͱ͍͏ೋख͕ؒݮΔɻ w w w w w w
w w ίʔυϨϏϡʔ͕ΑΓ͘͢͠ͳΔɻ w ίϛολʔͷҙਤ͕ಡΈऔΓ͘͢ͳΔ w w w w w w w w w w w อक͢Δ࣌ʹՕॴΛಛఆ͘͢͠ͳΔ w w w w w w
4FMG%PDVNFOUJOH$PEFͷΞϓϩʔν w ՄಡੑʹؾΛ͚ͭΔ w Λࡉ͔͘நԽ w ҉ͳલఏΛͳ͘͢
ՄಡੑʹؾΛ͚ͭΔ
ՄಡੑʹؾΛ͚ͭΔʢʣ ͳΜͷ 63-ͩΖʁ let url = URL(string: "https://iosdc.jp/2018/")!
ՄಡੑʹؾΛ͚ͭΔʢʣ let apiBaseURL = URL(string: "https://iosdc.jp/2018/")! "1*ͷ ϕʔε63-ͩͶʂ
r୭͔ l؆ܿ͞ΑΓɺΘ͔Γ͢͞z
ՄಡੑʹؾΛ͚ͭΔʢʣ class Player { // ... var allowsMagic: Bool {
return // ຐ๏͕͑Δ͔Ͳ͏͔ͷఆ } } ຐ๏Λ ڐՄʜʁ
ՄಡੑʹؾΛ͚ͭΔʢʣ class Player { // ... var canUseMagic: Bool {
return // ຐ๏͕͑Δ͔Ͳ͏͔ͷఆ } } ຐ๏͕ ͑Δ͔Ͳ͏͔͔ʂ
r୭͔ lޡղͷͳ͍දݱʹؾΛ͚ͭΑ͏z
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, _ baseView: UIView) { baseView.addSubview(subview)
} addSubview(avatarView, contentView) Ͳ͕ͬͪͲͬͪʹ Ճ͞ΕΔͷʜʁ
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(subview: UIView, baseView: UIView) { baseView.addSubview(subview) } addSubview(subview:
avatarView, baseView: contentView) ଟavatarView͕ࢠϏϡʔͰ contentView͕Ϗϡʔʁ
ՄಡੑʹؾΛ͚ͭΔʢʣ avatarViewΛ contentViewͷ্ʹՃͩͶʂ func addSubview(_ subview: UIView, onto baseView: UIView)
{ baseView.addSubview(subview) } addSubview(avatarView, onto: contentView)
r୭͔ lҾϥϕϧΛ͏·͘׆༻͠Α͏z
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView) { baseView.addSubview(subview)
} addSubview(avatarView, onto: contentView)
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded) {
if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded) ಡΈ͍͕͢ จ๏ΤϥʔͰ͋Δ
rܙྤ l4XJGUͷจ๏ʹ།Ұʹͯ͠࠷େͷෆຬ ޙஔϥϕϧ͕ͳ͍͜ͱz
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded) {
if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded)
ՄಡੑʹؾΛ͚ͭΔʢʣ enum AddSubviewPostLabel { case ifNeeded } func addSubview(_ subview:
UIView, onto baseView: UIView, _ label: AddSubviewPostLabel) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, .ifNeeded) ߈ུ"ɿޙஔϥϕϧ༻ͷenumҾΛ͑ͯ࡞Δ ɿར༻෦ΛಡΉͱ͔ͳΓಡΈ͍͢ ɿenumΛΘ͟Θ͟ఆٛ͠ͳ͍ͱ͍͚ͳ͍ɺ໘ष͍ɺ໊લিಥ͍͢͠
ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded: ())
{ if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded: ()) ߈ུ#ɿޙஔϥϕϧ༻ͷμϛʔҾΛ࡞Δ ɿԿՃͰఆٛ͢Δඞཁ͕ͳ͍ɺָ ɿར༻෦ΛಡΉ࣌ඍົʹͳͥ͜ͷҾͯ͠Δͷ͔Λߟ͑ͯ͠·͍ͦ͏
ՄಡੑʹؾΛ͚ͭΔʢʣ ߈ུ$ɿ࠷ॳ͔ΒޙஔϥϕϧΛ࡞Βͳ͍ ɿճΓ͘Ͳ͍ϫʔΫΞϥϯυ͕ཁΒͳ͍ ɿӳจ๏ͱͯͪ͠ΐͬͱඍົͳͷͰ͏ͪΐͬͱ໊લͷ͕ඞཁ͔ func addSubviewIfNeeded(_ subview: UIView, onto baseView:
UIView) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubviewIfNeeded(avatarView, onto: contentView)
rܙྤ l݁ɿޙஔϥϕϧཉ͍͠ɻz
ՄಡੑʹؾΛ͚ͭΔʢʣ class SomeSequence { private var numbers: [Int] = [3,
2, 1] private var isSorted: Bool = false // ... func getSorted() -> [Int] { self.numbers = self.numbers.sorted(by: <) self.isSorted = true return self.numbers } } let sequence = SomeSequence() // Կ͔ॲཧ... let sorted = sequence.getSorted() ฒͼସ͑ΒΕͨྻΛऔΖ͏ͱͨ͠ ͚ͩͳͷʹsequenceͷঢ়ଶ͕มΘͬͨ
ՄಡੑʹؾΛ͚ͭΔʢʣ class SomeSequence { private var numbers: [Int] = [3,
2, 1] private var isSorted: Bool = false // ... @discardableResult func sort() -> [Int] { self.numbers = self.numbers.sorted(by: <) self.isSorted = true return self.numbers } } let sequence = SomeSequence() // Կ͔ॲཧ... let sorted = sequence.sort() ͜ͷϝιουΓ͕͋Δ͕ ෭࡞༻͋Δϝιουͩʂ
r୭͔ l෭࡞༻͕͋Δ͔Ͳ͏͔Λ໌ࣔ͠Α͏z
IUUQTTXJGUPSHEPDVNFOUBUJPOBQJEFTJHOHVJEFMJOFTTUSJWFGPSqVFOUVTBHF
ՄಡੑʹؾΛ͚ͭΔ w ؆ܿ͞ΑΓɺΘ͔Γ͢͞ w ޡղͷͳ͍දݱʹؾΛ͚ͭΑ͏ w ҾϥϕϧΛ͏·͘׆༻͠Α͏ w ෭࡞༻͕͋Δ͔Ͳ͏͔Λ໌ࣔ͠Α͏
クイズ:象さんを冷蔵庫に入れる手順は? 1.冷蔵庫のドアを開ける 2.象さんを冷蔵庫の中に入れる 3.冷蔵庫のドアを閉める
ࡉ͔͘நԽ
ࡉ͔͘நԽ class SomeScreen { func presentWebPage() { // ΞυϨεόʔΛ... //
ΔϘλϯΛ... // ... // จࣈྻΛ URL ʹ... // URL ͔ΒϦΫΤετΛ... // ... // จࣈίʔυΛ... // ༰ͷϨΠΞτΛ... // ... // } }
ࡉ͔͘நԽ class SomeScreen { func presentWebPage() { // ॳظ WebPage
ը໘Λ࡞Δ // ࡞ͬͨ WebPage ը໘ʹભҠ͢Δ // ભҠ͕ऴΘͬͨΒ WebPage ը໘ͰಡΈࠐΉ } }
ࡉ͔͘நԽ class SomeScreen { func presentWebPage() { let screen =
WebPageScreen() self.present(screen, completion: { screen.loadAddress("user_defined") }) } }
ࡉ͔͘நԽ class SomeScreen { // presentWebPage private func present(_ screen:
WebPageScreen, completion: () -> Void) { // ભҠॲཧʹઐ೦ } } class WebPageScreen { // ը໘ߏʹઐ೦ func loadAddress(_ address: String) { // ಡΈࠐΈॲཧʹઐ೦ } }
Λࡉ͔͘நԽ͢Δ w ͍͖ͳΓ۩ମతͳ࣮Λߟ͑ͳ͍ w ෳࡶͳͦͦߟ͑Δͷ͍͠ w ؆୯ͳͰ͋Δఔͬ͘͟ΓͳΠϝʔδ͕͍͍ w ෳࡶͳػೳ΄Ͳɺͪΐͬͱׂͣͭ͢Δ w
Ұʹߟ͑ΔΛߜΕΔ w 5%%ʹ௨͡Δߟ͑ํ w ςετॻ͖͘͢ͳΔͱ͍͏خ͍͠෭࡞༻ w ෦ͷʹઐ೦͢Δ w ඞཁʹԠͯ͡%FMFHBUF$MPTVSFʹؙ͛
҉ͳલఏΛͳ͘͢
҉ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { var childViews: [UIView] = []
// ... func scrollToView(at index: Int) { self.contentOffset.x = self.bounds.width * CGFloat(index) } } தಡΜͰΈͨΒ ͜Ε֤childViewͷ෯͕ࣗͷ෯ͱಉ͡ ͱ͍͏લఏͰಈ͍ͯΔॲཧͩ
҉ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { var childViews: [UIView] = []
// ... func scrollToView(at index: Int) { self.contentOffset = self.childViews[index].frame.origin } } ͍ͭͲ͜Ͱ୭ʹݺΕΑ͏ͱඞͣ ֘childView͕දࣔ͞ΕΔॲཧͰ͋Δ ʢchildViewͷϨΠΞτͱ͍͏҉ͳલఏʹ ґଘ͠ͳ͍ʣ
҉ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { private var childViews: [UIView] =
[] // ... func scrollToChildView(at index: Int) { let childView = self.childViews[index] assert(childView.superview === self) self.contentOffset = childView.frame.origin } } Ͳ͏ͯ͠֎ͤͳ͍લఏ ඞͣ໌ࣔ͢Δ
҉ͳલఏΛͳ͘͢ w ͍ͭͲ͜Ͱ୭ʹݺΕͯಉ݁͡ՌʹͳΔΑ͏ʹ࡞Δ w Ͳ͏ͯ͠ඞཁͳલఏΛ໌ࣔ͢Δ w લఏΛҾʹͰ͖ΕҾʹ͢Δ w લఏΛҾʹͰ͖ͳ͚Ε໊લʹΈࠐΉ w
໊લʹΈࠐΉʹ͍͠߹࣮ͰΞαʔτ
4FMG%PDVNFOUJOH$PEFͷΞϓϩʔν w ՄಡੑʹؾΛ͚ͭΔ w Λࡉ͔͘நԽ w ҉ͳલఏΛͳ͘͢
͡Ό͋4FMG%PDVNFOUJOH$PEFͰॻ͍ͨϓϩάϥϜ ίϝϯτυΩϡϝϯτ͕શ͘ཁΒͳ͘ͳΔͷʁ
4FMG%PDVNFOUJOH$PEF͚ͩͰΓͳ͍ w $PEFʮ8IBUʯͱʮ)PXʯ͚͔ͩ͠આ໌Ͱ͖ͳ͍ w ϓϩάϥϜϓϩδΣΫτΛཧղ͢ΔͨΊʹ ʮ8IZʯඞཁʢΠϨΪϡϥʔͳ༷આ໌ͳͲʣ w υΩϡϝϯτίϝϯτͰ8IBUͱ)PXΛઆ໌͠ͳ ͯ͘ࡁΉΘΓʹɺ8IZͷઆ໌ʹઐ೦Ͱ͖Δ w
݁Ռͱͯ͠ඞཁՕॴϘϦϡʔϜ͕ݮΔʂ
4FMG%PDVNFOUJOH$PEFͰ ফͷগͳ͍։ൃϥΠϑΛ