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
120
SwiftUIもくもく会/swiftui_mokumoku
社内勉強会資料。SwiftUIをもくもく触る会の導入として。
きちえもん
January 15, 2020
Tweet
Share
More Decks by きちえもん
See All by きちえもん
Appleプライバシー保護の最新事情と適応戦略/Apple privacy
kichiemon
2
1.1k
オブジェクト指向UIの紹介/object_oriented_user_interface_design
kichiemon
2
170
エラーアーキテクチャ設計について考える/Thinking about error architecture design
kichiemon
6
5.5k
GitLab Runnerで始める自前CI環境/iosdc_2019_gitlab_runner
kichiemon
0
1.8k
Other Decks in Technology
See All in Technology
モダンデータスタックの理想と現実の間で~1.3億人Vポイントデータ基盤の現在地とこれから~
taromatsui_cccmkhd
2
300
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
2
630
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
2
530
AIBuildersDay_track_A_iidaxs
iidaxs
4
1.7k
20251225_たのしい出張報告&IgniteRecap!
ponponmikankan
0
100
Introduce marp-ai-slide-generator
itarutomy
0
170
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
0
570
202512_AIoT.pdf
iotcomjpadmin
0
180
Directions Asia 2025 _ Let’s build my own secretary (AI Agent) Part 1 & 2
ryoheig0405
0
110
AWS re:Inventre:cap ~AmazonNova 2 Omniのワークショップを体験してきた~
nrinetcom
PRO
0
120
[2025-12-12]あの日僕が見た胡蝶の夢 〜人の夢は終わらねェ AIによるパフォーマンスチューニングのすゝめ〜
tosite
0
240
さくらのクラウド開発ふりかえり2025
kazeburo
2
1.3k
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.8k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Are puppies a ranking factor?
jonoalderson
0
2.6k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5k
So, you think you're a good person
axbom
PRO
0
1.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
57
Faster Mobile Websites
deanohume
310
31k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Become a Pro
speakerdeck
PRO
31
5.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Ethics towards AI in product and experience design
skipperchong
1
150
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