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
SwiftUIもくもく会/swiftui_mokumoku
Search
きちえもん
January 15, 2020
Technology
0
100
SwiftUIもくもく会/swiftui_mokumoku
社内勉強会資料。SwiftUIをもくもく触る会の導入として。
きちえもん
January 15, 2020
Tweet
Share
More Decks by きちえもん
See All by きちえもん
Appleプライバシー保護の最新事情と適応戦略/Apple privacy
kichiemon
2
1k
オブジェクト指向UIの紹介/object_oriented_user_interface_design
kichiemon
2
160
エラーアーキテクチャ設計について考える/Thinking about error architecture design
kichiemon
6
5k
GitLab Runnerで始める自前CI環境/iosdc_2019_gitlab_runner
kichiemon
0
1.7k
Other Decks in Technology
See All in Technology
IVRyにおけるNLP活用と NLP2025の関連論文紹介
keisukeosone
0
180
.mdc駆動ナレッジマネジメント/.mdc-driven knowledge management
yodakeisuke
24
11k
ウォンテッドリーにおける Platform Engineering
bgpat
0
190
20250408 AI Agent workshop
sakana_ai
PRO
15
3.3k
ペアーズにおけるData Catalog導入の取り組み
hisamouna
0
270
AIと開発者の共創: エージェント時代におけるAIフレンドリーなDevOpsの実践
bicstone
1
240
似たような課題が何度も蘇ってくるゾンビふりかえりを撲滅するため、ふりかえりのテーマをフォーカスしてもらった話 / focusing on the theme
naitosatoshi
0
380
Spice up your notifications/try!Swift25
noppefoxwolf
2
340
Amebaにおける Platform Engineeringの実践
kumorn5s
6
890
テキスト解析で見る PyCon APAC 2025 セッション&スピーカートレンド分析
negi111111
0
270
NLP2025 参加報告会 / NLP2025
sansan_randd
4
510
AI AgentOps LT大会(2025/04/16) Algomatic伊藤発表資料
kosukeito
0
120
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
GitHub's CSS Performance
jonrohan
1030
460k
Building Applications with DynamoDB
mza
94
6.3k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
How GitHub (no longer) Works
holman
314
140k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
Thoughts on Productivity
jonyablonski
69
4.6k
Optimizing for Happiness
mojombo
377
70k
Code Reviewing Like a Champion
maltzj
522
39k
A Tale of Four Properties
chriscoyier
158
23k
Transcript
SwiftUI SwiftUI SwiftUI SwiftUI SwiftUI SwiftUIもくもくする もくもくする もくもくする もくもくする もくもくする
もくもくする 技術座談会 技術座談会 技術座談会 技術座談会 技術座談会 技術座談会 1 / 15
アジェンダ アジェンダ アジェンダ アジェンダ アジェンダ アジェンダ 1 1 1 1
1 1...... SwiftUIにさらっと触れる(10min) SwiftUIにさらっと触れる(10min) SwiftUIにさらっと触れる(10min) SwiftUIにさらっと触れる(10min) SwiftUIにさらっと触れる(10min) SwiftUIにさらっと触れる(10min) 2 2 2 2 2 2...... もくもくする(40min) もくもくする(40min) もくもくする(40min) もくもくする(40min) もくもくする(40min) もくもくする(40min) 3 3 3 3 3 3...... 成果を発表(8min) 成果を発表(8min) 成果を発表(8min) 成果を発表(8min) 成果を発表(8min) 成果を発表(8min) 4 4 4 4 4 4...... 次回のこと決める (2min) 次回のこと決める (2min) 次回のこと決める (2min) 次回のこと決める (2min) 次回のこと決める (2min) 次回のこと決める (2min) 2 / 15
さらっとSwiftUI-SwiftUIとは? さらっとSwiftUI-SwiftUIとは? さらっとSwiftUI-SwiftUIとは? さらっとSwiftUI-SwiftUIとは? さらっとSwiftUI-SwiftUIとは? さらっとSwiftUI-SwiftUIとは? WWDC2019 WWDC2019 WWDC2019 WWDC2019
WWDC2019 WWDC2019で発表 で発表 で発表 で発表 で発表 で発表 Swiftの新しい Swiftの新しい Swiftの新しい Swiftの新しい Swiftの新しい Swiftの新しいAppleデバイス用UIフレームワーク Appleデバイス用UIフレームワーク Appleデバイス用UIフレームワーク Appleデバイス用UIフレームワーク Appleデバイス用UIフレームワーク Appleデバイス用UIフレームワーク これまではUIKitやAppKitなどを使って開発していた これまではUIKitやAppKitなどを使って開発していた これまではUIKitやAppKitなどを使って開発していた これまではUIKitやAppKitなどを使って開発していた これまではUIKitやAppKitなどを使って開発していた これまではUIKitやAppKitなどを使って開発していた 宣言的 宣言的 宣言的 宣言的 宣言的 宣言的にUIを実装できる にUIを実装できる にUIを実装できる にUIを実装できる にUIを実装できる にUIを実装できる e.g.React、Flutter、JetpackComposeみたいな e.g.React、Flutter、JetpackComposeみたいな e.g.React、Flutter、JetpackComposeみたいな e.g.React、Flutter、JetpackComposeみたいな e.g.React、Flutter、JetpackComposeみたいな e.g.React、Flutter、JetpackComposeみたいな 3 / 15
さらっとSwiftUI-特徴 さらっとSwiftUI-特徴 さらっとSwiftUI-特徴 さらっとSwiftUI-特徴 さらっとSwiftUI-特徴 さらっとSwiftUI-特徴 「 「 「 「
「 「より優れたAppを、より少ないコードで。 より優れたAppを、より少ないコードで。 より優れたAppを、より少ないコードで。 より優れたAppを、より少ないコードで。 より優れたAppを、より少ないコードで。 より優れたAppを、より少ないコードで。」 」 」 」 」 」 全てのAppleプラットフォーム向けUIを構築できる 全てのAppleプラットフォーム向けUIを構築できる 全てのAppleプラットフォーム向けUIを構築できる 全てのAppleプラットフォーム向けUIを構築できる 全てのAppleプラットフォーム向けUIを構築できる 全てのAppleプラットフォーム向けUIを構築できる 宣言型Swiftシンタックス 宣言型Swiftシンタックス 宣言型Swiftシンタックス 宣言型Swiftシンタックス 宣言型Swiftシンタックス 宣言型Swiftシンタックス Xcodeのデザインツールと連携、コードをデザインと同期させる Xcodeのデザインツールと連携、コードをデザインと同期させる Xcodeのデザインツールと連携、コードをデザインと同期させる Xcodeのデザインツールと連携、コードをデザインと同期させる Xcodeのデザインツールと連携、コードをデザインと同期させる Xcodeのデザインツールと連携、コードをデザインと同期させる ダークモード、ローカリゼーション、アクセシビリティに自動対応 ダークモード、ローカリゼーション、アクセシビリティに自動対応 ダークモード、ローカリゼーション、アクセシビリティに自動対応 ダークモード、ローカリゼーション、アクセシビリティに自動対応 ダークモード、ローカリゼーション、アクセシビリティに自動対応 ダークモード、ローカリゼーション、アクセシビリティに自動対応 https://developer.apple.com/jp/xcode/swiftui https://developer.apple.com/jp/xcode/swiftui https://developer.apple.com/jp/xcode/swiftui https://developer.apple.com/jp/xcode/swiftui https://developer.apple.com/jp/xcode/swiftui https://developer.apple.com/jp/xcode/swiftui 4 / 15
さらっとSwiftUI-環境 さらっとSwiftUI-環境 さらっとSwiftUI-環境 さらっとSwiftUI-環境 さらっとSwiftUI-環境 さらっとSwiftUI-環境 Xcode11.3Swift5.1iOS13より、利用可能 Xcode11.3Swift5.1iOS13より、利用可能 Xcode11.3Swift5.1iOS13より、利用可能 Xcode11.3Swift5.1iOS13より、利用可能
Xcode11.3Swift5.1iOS13より、利用可能 Xcode11.3Swift5.1iOS13より、利用可能 GANMA!の場合、 GANMA!の場合、 GANMA!の場合、 GANMA!の場合、 GANMA!の場合、 GANMA!の場合、iOS11〜サポートなので、まだ利用は難しい... iOS11〜サポートなので、まだ利用は難しい... iOS11〜サポートなので、まだ利用は難しい... iOS11〜サポートなので、まだ利用は難しい... iOS11〜サポートなので、まだ利用は難しい... iOS11〜サポートなので、まだ利用は難しい... iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを iOS13だけの画面とか、WatchOSとか、macOSとか、新たにアプリを 作る場合は利用出来るかも 作る場合は利用出来るかも 作る場合は利用出来るかも 作る場合は利用出来るかも 作る場合は利用出来るかも 作る場合は利用出来るかも 5 / 15
チュートリアルリンクとか チュートリアルリンクとか チュートリアルリンクとか チュートリアルリンクとか チュートリアルリンクとか チュートリアルリンクとか 1 1 1 1
1 1...... 公式Tutorial読んだり、手を動かしたり 公式Tutorial読んだり、手を動かしたり 公式Tutorial読んだり、手を動かしたり 公式Tutorial読んだり、手を動かしたり 公式Tutorial読んだり、手を動かしたり 公式Tutorial読んだり、手を動かしたり https://developer.apple.com/tutorials/swiftui https://developer.apple.com/tutorials/swiftui https://developer.apple.com/tutorials/swiftui https://developer.apple.com/tutorials/swiftui https://developer.apple.com/tutorials/swiftui https://developer.apple.com/tutorials/swiftui projectファイルも落とせて、概要掴むにはよくできている projectファイルも落とせて、概要掴むにはよくできている projectファイルも落とせて、概要掴むにはよくできている projectファイルも落とせて、概要掴むにはよくできている projectファイルも落とせて、概要掴むにはよくできている projectファイルも落とせて、概要掴むにはよくできている 説明は足りないと思うので、適宜ぐぐったりする 説明は足りないと思うので、適宜ぐぐったりする 説明は足りないと思うので、適宜ぐぐったりする 説明は足りないと思うので、適宜ぐぐったりする 説明は足りないと思うので、適宜ぐぐったりする 説明は足りないと思うので、適宜ぐぐったりする 2 2 2 2 2 2...... 公式リファレンス/ドキュメント 公式リファレンス/ドキュメント 公式リファレンス/ドキュメント 公式リファレンス/ドキュメント 公式リファレンス/ドキュメント 公式リファレンス/ドキュメント https://developer.apple.com/documentation/swiftui/ https://developer.apple.com/documentation/swiftui/ https://developer.apple.com/documentation/swiftui/ https://developer.apple.com/documentation/swiftui/ https://developer.apple.com/documentation/swiftui/ https://developer.apple.com/documentation/swiftui/ 3 3 3 3 3 3...... WWDC2019の動画を見る WWDC2019の動画を見る WWDC2019の動画を見る WWDC2019の動画を見る WWDC2019の動画を見る WWDC2019の動画を見る IntroducingSwiftUI:BuildingYourFirstApp IntroducingSwiftUI:BuildingYourFirstApp IntroducingSwiftUI:BuildingYourFirstApp IntroducingSwiftUI:BuildingYourFirstApp IntroducingSwiftUI:BuildingYourFirstApp IntroducingSwiftUI:BuildingYourFirstApp https://developer.apple.com/videos/play/wwdc2019/204/ https://developer.apple.com/videos/play/wwdc2019/204/ https://developer.apple.com/videos/play/wwdc2019/204/ https://developer.apple.com/videos/play/wwdc2019/204/ https://developer.apple.com/videos/play/wwdc2019/204/ https://developer.apple.com/videos/play/wwdc2019/204/ 6 / 15
参考に 参考に 参考に 参考に 参考に 参考に 7 / 15
さらっとSwiftUI-Viewを作る さらっとSwiftUI-Viewを作る さらっとSwiftUI-Viewを作る さらっとSwiftUI-Viewを作る さらっとSwiftUI-Viewを作る さらっとSwiftUI-Viewを作る CreateProjectするとできる CreateProjectするとできる CreateProjectするとできる CreateProjectするとできる
CreateProjectするとできる CreateProjectするとできる import import SwiftUI SwiftUI struct struct ContentView ContentView: : View View { { var var body body: : some some View View { { Text Text( ("Hello, World!" "Hello, World!") ) } } } } struct struct ContentView_Previews ContentView_Previews: : PreviewProvider PreviewProvider { { static static var var previews previews: : some some View View { { ContentView ContentView( () ) } } } } 8 / 15
さらっとSwiftUI-Playground さらっとSwiftUI-Playground さらっとSwiftUI-Playground さらっとSwiftUI-Playground さらっとSwiftUI-Playground さらっとSwiftUI-Playground UIHostingControllerをつかう UIHostingControllerをつかう UIHostingControllerをつかう UIHostingControllerをつかう
UIHostingControllerをつかう UIHostingControllerをつかう import import SwiftUI SwiftUI import import PlaygroundSupport PlaygroundSupport struct struct ContentView ContentView: : View View { { var var body body: : some some View View { { Text Text( ("try! SwiftUI" "try! SwiftUI") ). .font font( (. .title title) ) } } } } PlaygroundPage PlaygroundPage. .current current. .liveView liveView = = UIHostingController UIHostingController( (rootView rootView: : ContentView ContentView( () )) ) 9 / 15
varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} ↓は一体どういうものなのかを紐解く ↓は一体どういうものなのかを紐解く ↓は一体どういうものなのかを紐解く ↓は一体どういうものなのかを紐解く
↓は一体どういうものなのかを紐解く ↓は一体どういうものなのかを紐解く var var body body: : some some View View { { VStack VStack { { Text Text( ("try! SwiftUI" "try! SwiftUI") ) Text Text( ("Hello World!" "Hello World!") ) } } } } 10 / 15
varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} varbody:someView{...} 諸々を省略せずにちゃんと書くとこうなる 諸々を省略せずにちゃんと書くとこうなる 諸々を省略せずにちゃんと書くとこうなる 諸々を省略せずにちゃんと書くとこうなる
諸々を省略せずにちゃんと書くとこうなる 諸々を省略せずにちゃんと書くとこうなる var var body body: : some some View View { { // 1 ブロックの時 return が省略できる // 1 ブロックの時 return が省略できる return return VStack VStack. .init init( (content content: : { { // コンストラクタ // コンストラクタ return return ViewBuilder ViewBuilder. .buildBlock buildBlock( ( Text Text( ("try! SwiftUI" "try! SwiftUI") ), , Text Text( ("Hello World!" "Hello World!") ) ) ) } }) ) } } ViewBuilder..? ViewBuilder..? ViewBuilder..? ViewBuilder..? ViewBuilder..? ViewBuilder..? 11 / 15
VStackの定義を見に行く VStackの定義を見に行く VStackの定義を見に行く VStackの定義を見に行く VStackの定義を見に行く VStackの定義を見に行く public public struct struct
VStack VStack< <Content Content> > : : View View where where Content Content : : View View { { @inlinable @inlinable public public init init( ( alignment alignment: : HorizontalAlignment HorizontalAlignment = = . .center center, , spacing spacing: : CGFloat CGFloat? ? = = nil nil, , @ @ViewBuilder ViewBuilder content content: : ( () ) - -> > Content Content ) ) public public typealias typealias Body Body = = Never Never } } @ViewBuilder @ViewBuilder @ViewBuilder @ViewBuilder @ViewBuilder @ViewBuilderがある がある がある がある がある がある 12 / 15
@ViewBuilderの定義を見に行く @ViewBuilderの定義を見に行く @ViewBuilderの定義を見に行く @ViewBuilderの定義を見に行く @ViewBuilderの定義を見に行く @ViewBuilderの定義を見に行く VStackのinitializer VStackのinitializer VStackのinitializer VStackのinitializer
VStackのinitializer VStackのinitializer init init( (. .. .. ., , @ @ViewBuilder ViewBuilder content content: : ( () ) - -> > Content Content) ) ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 @_functionBuilder @_functionBuilder public public struct struct ViewBuilder ViewBuilder { { public public static static func func buildBlock buildBlock( () ) - -> > EmptyView EmptyView public public static static func func buildBlock buildBlock< <Content Content> >( (_ _ content content: : Content Content) ) - -> > Content Content where where Content Content : : View View } } @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder が肝になる が肝になる が肝になる が肝になる が肝になる が肝になる 13 / 15
@_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder VStackのinitializer VStackのinitializer VStackのinitializer VStackのinitializer
VStackのinitializer VStackのinitializer init init( (. .. .. ., , @ @ViewBuilder ViewBuilder content content: : ( () ) - -> > Content Content) ) ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 ViewBuilderの定義 @_functionBuilder @_functionBuilder public public struct struct ViewBuilder ViewBuilder { { public public static static func func buildBlock buildBlock( () ) - -> > EmptyView EmptyView public public static static func func buildBlock buildBlock< <Content Content> >( (_ _ content content: : Content Content) ) - -> > Content Content where where Content Content : : View View } } @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder が肝になる が肝になる が肝になる が肝になる が肝になる が肝になる 14 / 15
@_functionBuilderとは? @_functionBuilderとは? @_functionBuilderとは? @_functionBuilderとは? @_functionBuilderとは? @_functionBuilderとは? Swift5.1から使える機能 Swift5.1から使える機能 Swift5.1から使える機能 Swift5.1から使える機能
Swift5.1から使える機能 Swift5.1から使える機能 @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilder @_functionBuilderを定義する を定義する を定義する を定義する を定義する を定義する @_functionBuilder struct ArrayBuilder @_functionBuilder struct ArrayBuilder @_functionBuilder struct ArrayBuilder @_functionBuilder struct ArrayBuilder @_functionBuilder struct ArrayBuilder @_functionBuilder struct ArrayBuilder staticfuncbuildBlock staticfuncbuildBlock staticfuncbuildBlock staticfuncbuildBlock staticfuncbuildBlock staticfuncbuildBlockに処理を書く に処理を書く に処理を書く に処理を書く に処理を書く に処理を書く static func buildBlock<T>(_ x: T) -> [T] { [x] } static func buildBlock<T>(_ x: T) -> [T] { [x] } static func buildBlock<T>(_ x: T) -> [T] { [x] } static func buildBlock<T>(_ x: T) -> [T] { [x] } static func buildBlock<T>(_ x: T) -> [T] { [x] } static func buildBlock<T>(_ x: T) -> [T] { [x] } @ArrayBuilder @ArrayBuilder @ArrayBuilder @ArrayBuilder @ArrayBuilder @ArrayBuilderが使えるようになる が使えるようになる が使えるようになる が使えるようになる が使えるようになる が使えるようになる func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> func makeArray<T>(@ArrayBuilder builder: () -> [T]) -> [T] [T] [T] [T] [T] [T] hoge{...}に渡されたものがbuildBlockに展開されて処理される hoge{...}に渡されたものがbuildBlockに展開されて処理される hoge{...}に渡されたものがbuildBlockに展開されて処理される hoge{...}に渡されたものがbuildBlockに展開されて処理される hoge{...}に渡されたものがbuildBlockに展開されて処理される hoge{...}に渡されたものがbuildBlockに展開されて処理される 15 / 15