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
Elvis Shi
October 03, 2017
Programming
3.3k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
責務範囲を意識するというお話
Elvis Shi
October 03, 2017
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
580
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
580
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
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
ActionController meets Protocol Buffers
sorah
0
680
phperだってパンチカードでコーディングしたい
o0h
PRO
0
410
AWSに止められる覚悟してますか?
morizo_1984
2
550
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
110
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
410
Seven New Principles of Software Engineering
yegor256
0
260
ChromeでローカルLLM
ryu1013
0
160
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
Simple Storage Service(S3) is not simple
iwatsukayura
0
320
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
130
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
Featured
See All Featured
Between Models and Reality
mayunak
4
500
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Bash Introduction
62gerente
615
220k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
270
Ruling the World: When Life Gets Gamed
codingconduct
0
420
Deep Space Network (abreviated)
tonyrice
0
380
First, design no harm
axbom
PRO
2
1.4k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
530
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
30 Presentation Tips
portentint
PRO
1
440
Transcript
ൣғΛҙࣝ͢Δͱ͍͏͓ for Զίϯ7PM%BZ
override init() { super.init() emplyedBy = "YUMEMI Inc." job =
"iOS Developer" twitter = "@lovee" qiita = "lovee" github = "el-hoshino" additionalInfo = "స৬͠·ͨ͠ʂ" class Speaker: Developer { } }
.PEFMɺ7JFXͱ$POUSPMMFS Λ࡞Ε͕͚ΒΕͨͬ ͯ͜ͱʹͳΔΜͰ͔͢ʁ
.PEFMɺ7JFXͱ$POUSPMMFSΛ࡞Ε ͕͚ΒΕͨͬͯ͜ͱʹͳΔΜͰ͔͢ʁ ͦ͏ͱݶΒͳ͍ ͦͦʮ࡞ͬͨʯͱ ʮਖ਼͘͠࡞ͬͨʯ ผ֓೦
ຊʹ͚ΒΕͯΔͷ͔ʁ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad()
view.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠Δ!
ઃܭͱͦΕΒͷʢͬ͘͟Γʣ ‣ .7$ ‣ .PEFMɿϏδωεϩδοΫ ‣ 7JFXɿը໘ग़ྗ ‣ $POUSPMMFSɿϢʔβೖྗ ‣
.77. ‣ .PEFMɿϏδωεϩδοΫ ‣ 7JFXɿը໘ೖग़ྗ ‣ 7JFX.PEFMɿσʔλόΠϯσΟϯά ‣ FUD
ઃܭͱͦΕΒͷʢͬ͘͟Γʣ ‣ .7$ ‣ 7JFXɿը໘ग़ྗ ‣ .77. ‣ 7JFXɿը໘ೖग़ྗ ۩ମతͳϏδϡΞϧදݱ
7JFXͷׂ
ຊʹ͚ΒΕͯΔͷ͔ʁ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad()
view.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠Δ!
ຊ͜͏͖͢͡Όͳ͍ͷ͔ʁ class ViewController: UIViewController { private lazy var _view =
View() override func loadView() { self.view = _view } override func viewDidLoad() { super.viewDidLoad() _view.setupVisual() } } class View: UIView { func setupVisual() { self.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠ͳ͍" ϏδϡΞϧͷઃఆશͯ Ϗϡʔʹू͞ΕΔ
Λҙࣝ͢Δͱݴ͏ͷ 7JFX.PEFMͱͯ͠ͷׂΛ ҙࣝ͢Δ͜ͱ
Λҙࣝ͢Δͱݴ͏ͷ 7JFX.PEFMͱͯ͠ͷׂΛ ҙࣝ͢Δ͜ͱ ͚ͩͰͳ͍
https://qiita.com/lovee/items/555a5b76097347aa2367
ंͷΨεܽ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia)
ंͷΨεܽ Ψεܽ څ༉͠ʹߦ͘ څ༉
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } func outOfGasoline() { // ??? } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // ???
ंͷΨεܽ Ψεܽ څ༉͠ʹߦ͘ څ༉ - ࠷دΓͷΨιϦϯελϯυ͕Ͳ͜ʹ͋ͬͯͲ͏ߦ͔͘ʁ - څ༉ελοϑʹͲ͏͑Δ͔ʁ - ࢧ͍Ͳ͏͢Δ͔ʁ
- FUD ͜ΕΒͷ ॴ༗ऀ͕ղܾ͢Δ ඞཁ͕͋Δʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner?.buyGasoline() } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy some gasoline!
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ څ༉ͤ͞Δ څ༉͠ʹߦ͘ څ༉ څ༉͕ ऴΘΔ Ψεܽղܾ -
શͯͷॲཧं͕ߦͳ͍ͬͯΔ - ॴ༗ऀंʹͬऔΒΕͯ͠·͏ - ͷͪͷ4LZOFUʢେӕʣ ͜ΕΒͷ ͋͘·Ͱॴ༗ऀ͕ࣗ ղܾ͖͢ʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyGasoline() } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy some gasoline!
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ ΒͤΔ څ༉͠ʹߦ͘ څ༉ څ༉͕ ऴΘΔ Ψεܽղܾ -
શͯͷॲཧॴ༗ऀ͕ߦͳ͍ͬͯΔ - ॴ༗ऀंʹͬऔΒΕͯ͠·Θͳ͍ - ॴ༗ऀͷؾ࣋ͪͰങ͍͑Δ͜ͱՄೳʂ
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ ΒͤΔ σΟʔϥʔʹߦ͘ ങ͍͑Δ ৽͍͠ंΛೖख - શͯͷॲཧॴ༗ऀ͕ߦͳ͍ͬͯΔ -
ॴ༗ऀंʹͬऔΒΕͯ͠·Θͳ͍ - ॴ༗ऀͷؾ࣋ͪͰങ͍͑Δ͜ͱՄೳʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyCar(Car("488GTB")) } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy Ferrari 488 GTB!
Λҙࣝ͢Δͱݴ͏ͷ ෦ͷॴ༗ؔʢ֊ؔʣΛ ҙࣝ͢Δ͜ͱͰ͋Δ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyCar(Car("488GTB")) } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy Ferrari 488 GTB!
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ं͕ΦʔφʔͷߦಈʹΛ࣋ͯ ͳ͍ʹ͕ͳ͍ - ͔ͩΒΦʔφʔΛॴ༗ͯ͠ ͍͚ͳ͍ - ͦΕͰΦʔφʔΛಈ͔͢ ͜ͱͰ͖ͳ͍ - Ͱ$BS0XOFSͱͯ͠ಈ͚Δ ͜ͱ͍ͬͯΔ - ඞཁͳ࣌ʹΦʔφʔʹॲཧΛ ҠৡͰ͖Δ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ंΦʔφʔΛॴ༗͍ͯ͠ͳ͍ - ΦʔφʔΛऑࢀর͠ͳ͚ΕͳΒͳ͍ - ڧࢀর͏͔ɺऑࢀর͏͔ͷج४ɺ ͜ͷΦϒδΣΫτΛॴ༗͍ͯ͠Δ͔Ͳ͏͔ - ॴ༗ؔҰํ௨ߦͳͷͰɺ॥ࢀর ͷճආͰ͖Δ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ໋໊িಥͷճආ - ͔͢͠Δͱಉ໊͡લͷผͷϝιου͕ ͋Δ͔͠Εͳ͍ - Ҡৡݩ୭͔ΛผͰ͖ΔΑ͏ʹ - Ҡৡઌ͕ಉ͡ΫϥεͷෳΦϒδΣΫτ ࣋ͬͯΔ͔͠Εͳ͍
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ࣗࣗΛ࿐ͨ͘͠ͳ͍߹Ͳ͏͠Α͏# - ྫ͑Ҡৡઌࣗͷॴ༗ऀ͡Όͳ͍͔ ͠Εͳ͍߹ - యܕతͳύλʔϯ7JFXͷ%BUB4PVSDF - ͜͜ͰंͷΨϨʔδΛྫʹ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarGarage: class { func carNeedsToPark(_ car: CarGarageUser) }
protocol CarGarageUser: class { var garageUserModel: String { get } } class Car { let model: String weak var garage: CarGarage? // ... func parkToGarage() { self.garage?.carNeedsToPark(self) } } extension Car: CarGarageUser { var garageUserModel: String { return self.model } } ࣗࣗΛ$BSͷΘΓʹ $BS(BSBHF6TFSͱͯ͠࿐ $BS(BSBHF͕ඞཁͦ͏ͳͷ͚ͩΛ $BS(BSBHF6TFSͱͯ͠ఏڙ
Λҙࣝ͢Δͱݴ͏ͷ ඞཁ࠷খݶͷใΛΓͳ͕Β ඞཁ࠷খݶͷใΛ࿐͢ΔͷΛ ҙࣝ͢Δ͜ͱͰ͋Δ
·ͱΊ ‣ ൣғΛҙࣝ͠Α͏ ‣ ෦ʢ7JFX.PEFMʣͱͯ͠ͷׂΛҙࣝ͠Α͏ ‣ ෦ͷॴ༗ؔʢ֊ؔʣΛҙࣝ͠Α͏ ‣ ඞཁ࠷খݶͷใͷอ࣋ͱΓऔΓΛҙࣝ͠Α͏
ൣғΛҙࣝͯ͠ ༷มߋʹڧ͍։ൃΛ "