Xcodeにデフォルトで用意されているファイル群について[備忘]
Xcode上のswiftファイル
Xcodeを起動すると、まずデフォルトでイメージのようなファイル群が用意される。
起動時の画面
この中で、swiftファイルとして存在しているのは、以下の2ファイル。
- RensyuuApp.swift
- ContentView.swift
RensyuuApp.swiftの内容
import SwiftUI
@main
struct RensyuuApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
import SwiftUI
SwiftUIという名のフレームワーク[1]をインポートしている。
@main
エントリポイントです。エントリーポイントとは、プログラムを実行するうえで、プログラムやサブルーチンの実行を開始する場所のこと。プログラム全体のエントリーポイントとなる場所を含むルーチンがメインルーチンである。
struct RensyuuApp: App
インタフェース[2]『App』を実装する形で、構造体『RensyuuApp』を定義しています。
var body: some Scene
変数の宣言は、
var 変数名:型
という形をとる。であれば、
var body: some Scene
上記の場合、some型のbodyという変数名ということになりそう。
ただ、some Scene、とは、2単語であるから、この2単語で型を示すのか?
と、疑問が生じた。
で、調査したところ、良い記事が見つかったので、抜粋しておく。
[SwiftUIに出てくるsomeとは何なのか]
これによると、someは、Opaque Result Typeを表すためのキーワード、ということらしい。
つまり、Sceneが、型、ということになる。
で、さらに、以下を読んでみると、Sceneは、プロトコル、ということらしい。
[【SwiftUI】Sceneプロトコルを読む]
まとめると、
var body: some Scene
『Opaque Result Type』な、Sceneプロトコルである、変数bodyを宣言した、
ということかと思われる。(細かい意味は、機会のある時に再び…)
WindowGroup
親ビュー、というものらしい。
このビューから、子ビュー(ここで言うところの、”ContentView()”)を作り出し、
管理して表示するような、そんなイメージらしい。
以下のサイトを参考にすると、なんとなく親ビューというものが掴めそう。
[[SwiftUI] SwiftUI の layout システムを理解する (基礎編: レイアウトシーケンス)]
ContentView.swiftの内容
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI
SwiftUIという名のフレームワークをインポートしている。
この記述は、『RensyuuApp.swift』でもしているが、同じ意図。
struct ContentView: View
インタフェース『View』を実装する形で、構造体『ContentView』を定義しています。
var body: some View
『Opaque Result Type』な、Viewプロトコルである、変数bodyを宣言した、
ということかと思われる。(細かい意味は、機会のある時に再び…)
Text("Hello, world!")
テキストとして、『Hello, world!』を表示せよ、という命令。
.padding()
テキストを表示する上で、上下左右にどれだけ”空白”をいれるか設定。
struct ContentView_Previews: PreviewProvider
意味的には、インタフェース『PreviewProvider』を実装する形で、
構造体『ContentView_Previews』を定義しています。
PreviewProviderプロトコルについては、以下のサイトが良さそう。
[SwiftUIチュートリアルをやってみた その1]
static var previews: some View
『Opaque Result Type』な、Viewプロトコルである、構造体previewsを定義する、
ということかと思われる。(細かい意味は、機会のある時に再び…)
ContentView()
該当するstructをインスタンス化している、という話です。
素朴な疑問なのだが
RensyuuApp.swift内の、RensyuuAppから、ContentView()が呼び出されて
インスタンス化されているように思われる。
要するに
この際、ContentView.swift内で、呼び出される順は、
となる気がするが、どうなのだろうか?
RensyuuApp、からは、ContentView、を呼び出しているように見えるが
この時に、ContentViewよりも先に、ContentView_Previewsが呼び出されないと
なんかソースコードの書きっぷり的には、動作順が変な気がする…。
ただ、呼び出し元(RensyuuApp)からは、ContentView_Previewsを指定していない。
なのに、なぜ?こいつ(ContentView_Previews)は実行されるのだろうか?
しっくりこないので、調査して、特定できたら、更新しようと思う。
RensyuuApp、からは、ContentView、を呼び出しているように見えるが
この時に、ContentViewよりも先に、ContentView_Previewsが呼び出されないと
なんかソースコードの書きっぷり的には、動作順が変な気がする…。
これ、勘違い、ということが分かった。
RensyuuAppは、ContentViewを呼び出しており、ContentView_Previewsを呼んでいない。
では、ContentView_Previewsは、誰が呼んでいるの?
この答えは、↓の書籍のp208に書いてあった。
答えは、Xcodeのプレビュー機能である[Live Preview]ボタンを押した時だということだ!
所感
なるほどね〜。すごい納得しました。ありがとうございました。
こんなの本読まないと、どこにも書いていないよね…。
書いてあるのかも知れないけど、気づかないって…。
とりあえず、ContentView、に追記修正する形で画面表示を変更することは出来そうです。
他のサンプルコードを見て、次第に理解が深まってきたら、随時、更新をかけてみようと思います。
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
}
}
上記のText部分を変更すれば、画面表示されるテキスト文字は変更される、とね。