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
Sony-DroidKaigi2026
sony
1
310
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
120
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
140
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
6
6.9k
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
GuardDuty 検知対応を DevOps Agent で効率化しようとしている話 / GuardDuty Investigations with DevOps Agent
masahirokawahara
1
290
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
280
Azure Cost Management の FOCUS コストデータを迷わず読むための“3つの軸”
tetsuyaooooo
0
140
Claude Codeの体系的な理解と知識のフック
oikon48
10
6.7k
Self Healing Rollouts: Automating Production Fixes with Agentic AI
kdubois
0
150
AIエージェントの開発・提供におけるセキュリティリスクの論点と対策
flatt_security
1
560
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
230
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
320
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Bash Introduction
62gerente
615
220k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
Building AI with AI
inesmontani
PRO
1
1.2k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
Agile that works and the tools we love
rasmusluckow
331
22k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
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