Closed4

Xcodeにデフォルトで用意されているファイル群について[備忘]

気晴らし湯王気晴らし湯王

Xcode上のswiftファイル

Xcodeを起動すると、まずデフォルトでイメージのようなファイル群が用意される。

起動時の画面

この中で、swiftファイルとして存在しているのは、以下の2ファイル。

  • RensyuuApp.swift
  • ContentView.swift

RensyuuApp.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とは何なのか]
https://techblog.recochoku.jp/7754
これによると、someは、Opaque Result Typeを表すためのキーワード、ということらしい。
つまり、Sceneが、型、ということになる。
 
 
で、さらに、以下を読んでみると、Sceneは、プロトコル、ということらしい。
[【SwiftUI】Sceneプロトコルを読む]
https://qiita.com/imchino/items/988a3f3bdc73953fb92e
 
 
まとめると、

var body: some Scene

『Opaque Result Type』な、Sceneプロトコルである、変数bodyを宣言した、
ということかと思われる。(細かい意味は、機会のある時に再び…)

WindowGroup

親ビュー、というものらしい。
このビューから、子ビュー(ここで言うところの、”ContentView()”)を作り出し、
管理して表示するような、そんなイメージらしい。
 
 
以下のサイトを参考にすると、なんとなく親ビューというものが掴めそう。
[[SwiftUI] SwiftUI の layout システムを理解する (基礎編: レイアウトシーケンス)]
https://software.small-desk.com/development/2021/08/12/swiftui-layout-basic-part1/#i-3

ContentView.swiftの内容

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]
https://medium.com/swift-column/swiftui-tutorial-1-690de7cf5076

static var previews: some View

『Opaque Result Type』な、Viewプロトコルである、構造体previewsを定義する、
ということかと思われる。(細かい意味は、機会のある時に再び…)

ContentView()

該当するstructをインスタンス化している、という話です。

脚注
  1. SwiftフレームワークとはSwiftにおけるシステム開発のプログラミングを効率的に実施するために汎用的な機能群をまとめ、システムの骨組みとなるテンプレートまで用意してくれる枠組みのことです。 フレームワークを活用することでプログラミングにおける記述コードを最小限に抑えることが出来ます。 ↩︎

  2. Swiftインタフェースは、キーワード『Protocol』を利用して定義した物です。 ↩︎

気晴らし湯王気晴らし湯王

素朴な疑問なのだが

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に書いてあった。

https://www.amazon.co.jp/Swift-たった2日でマスターできる-iPhoneアプリ開発集中講座-Xcode13-iOS15/dp/4802613415/ref=pd_lpo_2?pd_rd_i=4802613415&psc=1

答えは、Xcodeのプレビュー機能である[Live Preview]ボタンを押した時だということだ!

所感

なるほどね〜。すごい納得しました。ありがとうございました。
こんなの本読まないと、どこにも書いていないよね…。
書いてあるのかも知れないけど、気づかないって…。

気晴らし湯王気晴らし湯王

とりあえず、ContentView、に追記修正する形で画面表示を変更することは出来そうです。
他のサンプルコードを見て、次第に理解が深まってきたら、随時、更新をかけてみようと思います。

ContentView.swift
struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

上記のText部分を変更すれば、画面表示されるテキスト文字は変更される、とね。

このスクラップは2022/03/16にクローズされました