Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Phantom Typeでコンパイル時に状態チェックする: shibuya.swift #4
Search
kazuhiro4949
June 08, 2016
Technology
1.5k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Phantom Typeでコンパイル時に状態チェックする: shibuya.swift #4
kazuhiro4949
June 08, 2016
More Decks by kazuhiro4949
See All by kazuhiro4949
SwiftUIをUIKitのライフサイクルで拡張するTips
kazuhiro4949
4
2.9k
iOS15でプッシュ通知のテストが大変だった話
kazuhiro4949
0
660
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
4.9k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
400
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
140
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
28
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
350
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.7k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
360
Other Decks in Technology
See All in Technology
モダンフロントエンド 開発研修
recruitengineers
PRO
4
810
コネクションをピン留めさせずに SELECTクエリのタイムアウトを設定した話
codmoninc
0
160
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
150
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
180
AIに狂うスタートアップが、あえて「人との協働」に全振りした新卒エンジニア研修 / New Graduate Engineer Training at a Startup Accelerating AI Adoption
ohnoeight
0
120
システム思考で問題に対処する
yussak
0
350
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
140
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
580
Model Studio CLI × Token Plan
maigo999
0
190
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
0
760
What's new in Go 1.27?
ciarana
0
280
会社紹介資料 / Sansan Company Profile
sansan33
PRO
24
430k
Featured
See All Featured
Practical Orchestrator
shlominoach
191
12k
For a Future-Friendly Web
brad_frost
183
10k
Evolving SEO for Evolving Search Engines
ryanjones
0
260
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
220
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
420
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
First, design no harm
axbom
PRO
2
1.3k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
300
GitHub's CSS Performance
jonrohan
1033
470k
Transcript
1IBOUPN5ZQFͰίϯύΠϧ࣌ʹ ঢ়ଶνΣοΫΛ͢Δ TIJCVZBTXJGU ,B[VIJSP)BZBTIJ
1IBOUPN5ZQFͱ ཁܕύϥϝʔλΛͬͯɺ ݟ্ͨݱΕͳ੍͍Λ͚Δ͜ͱΒ͍͠
1IBOUPN5ZQFͱ ༓ྶΈ͍ͨͳܕ ཁܕύϥϝʔλΛͬͯɺ ݟ্ͨݱΕͳ੍͍Λ͚Δ͜ͱΒ͍͠
1IBOUPN5ZQFͱ ༓ྶΈ͍ͨͳܕ 1IBOUPN5ZQF ཁܕύϥϝʔλΛͬͯɺ ݟ্ͨݱΕͳ੍͍Λ͚Δ͜ͱΒ͍͠
ྫ͑ʜ
1IBOUPN5ZQFΛͬͨ Ϋϥεఆٛ class PokemonStateType {} class Struggle: PokemonStateType {} //
ઓಆঢ়ଶ class Calm: PokemonStateType {} // ٳܜঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} }
1IBOUPN5ZQFΛͬͨ Ϋϥεఆٛ class PokemonStateType {} class Struggle: PokemonStateType {} //
ઓಆঢ়ଶ class Calm: PokemonStateType {} // ٳܜঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} } ঢ়ଶΛܕύϥϝʔλͱͯ࣋ͭ͠ϙέϞϯΫϥεΛ࡞͢Δ
1IBOUPN5ZQFΛͬͨ Ϋϥεఆٛ class PokemonStateType {} class Struggle: PokemonStateType {} //
ઓಆՄೳঢ়ଶ class Calm: PokemonStateType {} // ઓಆෆՄঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} } ϙέϞϯʮઓಆঢ়ଶʯͱʮٳܜঢ়ଶʯΛ࣋ͭ class PokemonStateType {} class Struggle: PokemonStateType {} // ઓಆঢ়ଶ class Calm: PokemonStateType {} // ٳܜঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} }
1IBOUPN5ZQFΛͬͨ Ϋϥεఆٛ class PokemonStateType {} class Struggle: PokemonStateType {} //
ઓಆՄೳঢ়ଶ class Calm: PokemonStateType {} // ઓಆෆՄঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} } ઓಆঢ়ଶͷ࣌BUUBDL ͕࣮ߦՄೳ class PokemonStateType {} class Struggle: PokemonStateType {} // ઓಆঢ়ଶ class Calm: PokemonStateType {} // ٳܜঢ়ଶ class Pokemon<T: PokemonStateType> { static func use() -> Pokemon<Calm> { return Pokemon<Calm>() } func ready() -> Pokemon<Struggle> { return Pokemon<Struggle>() } } extension Pokemon where T: Struggle { func attack() {} }
1PLFNPOΫϥεΛͬͯΈΔ let pokemon = Pokemon.use() pokemon.attack() // -> ίϯύΠϧ࣌ʹΤϥʔ pokemon.ready().attack()
// -> ͬͪ͜ίϯύΠϧΤϥʔ͕ग़ͳ͍
1PLFNPOΫϥεΛͬͯΈΔ let pokemon = Pokemon.create() pokemon.attack() // -> ίϯύΠϧ࣌ʹΤϥʔ pokemon.ready().attack()
// -> ͬͪ͜ίϯύΠϧΤϥʔ͕ग़ͳ͍ ܕύϥϝʔλʹ$BMN͕࣋ͭ߹ɺBUUBDL ϝιο υݺͳ͍ let pokemon = Pokemon.use() pokemon.attack() // -> ίϯύΠϧ࣌ʹΤϥʔ pokemon.ready().attack() // -> ͬͪ͜ίϯύΠϧΤϥʔ͕ग़ͳ͍
1PLFNPOΫϥεΛͬͯΈΔ let pokemon = Pokemon.create() pokemon.attack() // -> ίϯύΠϧ࣌ʹΤϥʔ pokemon.ready().attack()
// -> ͬͪ͜ίϯύΠϧΤϥʔ͕ग़ͳ͍ ܕύϥϝʔλʹ4USVHHMFΛ࣋ͭ1PLFNPOͷ߹ɺ BUUBDL ϝιου͕ݺΔ let pokemon = Pokemon.use() pokemon.attack() // -> ίϯύΠϧ࣌ʹΤϥʔ pokemon.ready().attack() // -> ͬͪ͜ίϯύΠϧΤϥʔ͕ग़ͳ͍
ݟ্͔͚Ӆ͞ΕͨܕΛͬͯ ঢ়ଶཧ͕Ͱ͖ͨʜ
࣮༻ྫ
IUUQTHJUIVCDPNLB[VIJSP4USJOH4UZMJ[FS
4USJOH4UZMJ[FS w /4"UUSJCVUFE4USJOHΛܕʹΑ͍ͬͯ͘͢͠ ͨϥΠϒϥϦΛ࡞Γ·ͨ͠ w 1IBOUPN5ZQFʹΑͬͯൣғબதͱελΠϧ ద༻தͷঢ়ଶΛΓସ͑Δ
4USJOH4UZMJ[FS let msg = “shibuya.swift".stylize() .range(0..<7) .color(0x009911).font(.HelveticaNeue) .range(8..<UInt.max).color(0xaa22cc).font(.HelveticaNeue_Bold).attr w ςΩετʹରͯ͠ϝιουνΣʔϯͰελΠϧΛద༻͠
͍ͯ͘ w /4"UUSJCVUFE4USJOHͱಉ༷ɺҙͷൣғʹରͯ͠ελ ΠϧΛద༻͢Δͱ͍͏ྲྀΕͰͭ͘Δ
ঢ়ଶભҠਤͱͯ͠·ͱΊΔͱ ܕύϥϝʔλΛΓସ͑Δ͜ͱͰঢ়ଶΛߦͬͨΓདྷͨ Γ͠ͳ͕ΒɺదͳϝιουΛίʔϧ͢Δ
ঢ়ଶʹΑͬͯ ίϯύΠϧΤϥʔ͕ى͖Δ // ൣғબͨ͋͠ͱͰԿ͔ελΠϧΛద༻͍ͯ͠ͳ͍ͱίϯύΠϧΤϥʔ label.attributedText = "shibuya.swift".stylize().range(0..<7).attr // ൣғબޙʹ৭Λద༻͍ͯ͠ΔͷͰίϯύΠϧʹ௨Δ label.attributedText
= "shibuya.swift".stylize().range(0..<7).color(0x009911).attr ྫ͑6*-BCFMʹରͯ͠ɺจࣈྻͷ͋Δൣғͷ ΈελΠϧΛద༻ͯ͠ೖ͢Δ߹Λߟ͑Δ
ঢ়ଶʹΑͬͯ ίϯύΠϧΤϥʔ͕ى͖Δ // ൣғબͨ͋͠ͱͰԿ͔ελΠϧΛద༻͍ͯ͠ͳ͍ͱίϯύΠϧΤϥʔ label.attributedText = "shibuya.swift".stylize().range(0..<7).attr // ൣғબޙʹ৭Λద༻͍ͯ͠ΔͷͰίϯύΠϧʹ௨Δ label.attributedText
= "shibuya.swift".stylize().range(0..<7).color(0x009911).attr ൣғબΛ͍ͯ͠Δ࣌ɺͦͷޙͰඞͣελΠ ϧͷద༻Λ͢Δඞཁ͕͋Δ
ঢ়ଶʹΑͬͯ ίϯύΠϧΤϥʔ͕ى͖Δ // ൣғબͨ͋͠ͱͰԿ͔ελΠϧΛద༻͍ͯ͠ͳ͍ͱίϯύΠϧΤϥʔ label.attributedText = "shibuya.swift".stylize().range(0..<7).attr // ൣғબޙʹ৭Λద༻͍ͯ͠ΔͷͰίϯύΠϧʹ௨Δ label.attributedText
= "shibuya.swift".stylize().range(0..<7).color(0x009911).attr ελΠϧΛద༻ͨ͠ޙɺผͷελΠϧΛద༻ ͢Δ͔/4"UUSJCVUFE4USJOHͱͯ͠ೖͰ͖Δ
1IBOUPN5ZQF·ͱΊ w ܕύϥϝʔλʹΑͬͯΦϒδΣΫτͷৼΔ͍ ʹ੍Λ༩͑ΒΕΔ w ίϯύΠϥʹΑͬͯਖ਼͍͠ৼΔ͍Λ͍ͯ͠Δ͔ Ͳ͏͔νΣοΫͰ͖Δ w ؒҧͬͯͨΒ͝ΊΜ
͠Կ͔͏·͍͍ํ͕͋Ε ڭ͑ͯԼ͍͞N @@ N
ࢀߟࢿྉ w 4XJGUͰ1IBOUPN5ZQF ༓ྶܕ w IUUQRJJUBDPNUBLFUPJUFNTFGEFDEF w 'VODUJPOBM4OJQQFU1IBOUPN5ZQFT w
IUUQTXXXPCKDJPCMPHGVODUJPOBMTOJQQFUQIBOUPNUZQFT w LB[VIJSP4USJOH4UZMJ[FS w IUUQTHJUIVCDPNLB[VIJSP4USJOH4UZMJ[FS