61886


SwiftとSwiftUIを学び始めたばかりの初心者です。VStackが構造体ということはわかりました。  
`VStack`はあらかじめ定義されたものですが、チュートリアルにあるような`body`の中にかく`VStack`はオーバーライドの記法なのでしょうか？

ここの記法がどういうものなのかを教えていただけると幸いです。

↓AppleのSwiftUIチュートリアルより引用

[code]

    struct ContentView: View {
        var body: some View {
            VStack {
                Text("Turtle Rock")
                    .font(.title)
                Text("Joshua Tree National Park")
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2019-12-29T15:11:18.913
61875
2019-12-30T01:34:01.530
2019-12-30T01:34:01.530
13972
37250
question
swift swiftui
SwiftUIのVStackの書式がよくわからない


SwiftUIについては、functionBuilderなんて、かなり大掛かりな言語機能自体の拡張が関わっているのですが、あなたが引用したような「チュートリアルにあるような`body`の中にかく`VStack`」に関して言うと、
**旧来のSwiftにもあったイニシャライザ構文** と言うことになります。

(「構造体では継承やオーバライドはできない」と言う点について、Swift言語としての変更はありません。)

`VStack`には、  
[`init(alignment: HorizontalAlignment, spacing: CGFloat?, content: () ->
Content)`](https://developer.apple.com/documentation/swiftui/vstack/3278367-init)  
と言うイニシャライザがありますが、前2つの引数`alignment`と`spacing`は省略可なので、クロージャ型である`content`引数を[trailing
closureの構文](https://docs.swift.org/swift-
book/LanguageGuide/Closures.html#ID102)で呼び出している形になります。

その部分をtrailing closureを使わずに書く(ついでに`return`の省略もやめる)とこんな感じですね:

[code]

    struct ContentView: View {
        var body: some View {
            return VStack.init(content: {
                Text("Turtle Rock")
                    .font(.title)
                Text("Joshua Tree National Park")
            })
        }
    }
    
[/code]

(`body`は単に計算型プロパティ。`.init`なんて普通は書かないですが、ここでは「イニシャライザである」ことを強調するために書いてます。)

* * *

実はここで起こっているもっと **不思議なこと**
は`content`に渡されているクロージャがどうコンパイルされているかにあるのですが、今回は直接のご質問内容には含まれないようなので、触れないでおきます。

ご興味がおありでしたら、[この質問](https://ja.stackoverflow.com/q/59567/13972)の質問内にあるリンク先(片方は英語ですが)を熟読してみると良いでしょう。


CC BY-SA 4.0
2019-12-30T01:23:11.077
61886
2019-12-30T01:23:11.077
13972
61875
answer