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
650
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
4.8k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
390
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
130
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
28
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
350
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.7k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
350
Other Decks in Technology
See All in Technology
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
130
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
350
“詰む”前に仕組みを作れ 〜技術の波に溺れないためのキャッチアップ術〜
takasyou
7
4.3k
組織における AI-DLC 実践
askul
0
170
Text-to-SQLをAgentCoreで実現し、生成されるSQLの精度を定量的に評価する
yakumo
2
110
toB プロダクトから見たWAF
tokai235
0
250
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
7.7k
AI時代における最適なQA組織の作り方
ymty
3
170
初めてのDatabricks勉強会
taka_aki
2
190
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
2
430
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
150
トークン最適化のためのユーザーストーリー分析 / User Story Analysis for Token Optimization
oomatomo
0
130
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
330
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
790
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
640
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
The Limits of Empathy - UXLibs8
cassininazir
1
370
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Music & Morning Musume
bryan
47
7.2k
Site-Speed That Sticks
csswizardry
13
1.2k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Optimizing for Happiness
mojombo
378
71k
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