63029
SwiftUIを使って”tap”と書かれた`Button`をタップすると、`Text`に「good
morning」と表示させるものを作ろうとしたのですが、うまくいきません。

おそらく、`greeting`のプロパティ`morning`（Bool型）の変更がうまくいってないものと思われます。これはstructが参照型であることによる現象だと思うのですが、解決策が思いつきませんでした。

[![view](https://i.stack.imgur.com/5paxh.png)](https://i.stack.imgur.com/5paxh.png)

```

    import SwiftUI
    
    struct ContentView: View {
        var greetingText = greeting()
        var body: some View {
            VStack{
                greetingText
                Button(action:{
                    self.greetingText.changeText()
                }){
                    Text("tap")
                }
            }
        }
    }
    
    struct greeting:View {
        @State private var morning:Bool = false
        var body: some View{
            VStack{
                if morning {
                    Text("Good morning")
                }else{
                    Text("hello")
                }
            }
        }
        func changeText(){
            self.morning = true
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
```
CC BY-SA 4.0
2020-02-13T15:06:54.293
63026
2020-02-13T20:12:18.433
2020-02-13T17:00:40.267
3060
37250
question
swift swiftui
SwiftUIでstructのプロパティを変更できない
`Button`を`Greeting`に持たせるか、`@Binding`で`ContentView`と`Greeting`の間で変数を紐づけることで解決できると思います。

(1) `Greeting`側で`Button`アクションの処理

```

    struct ContentView: View {
        var body: some View {
            VStack {
                Greeting()
            }
        }
    }
    
    struct Greeting: View {
        @State private var morning: Bool = false
    
        var body: some View {
            VStack {
                if morning {
                    Text("Good morning")
                } else {
                    Text("hello")
                }
                Button("tap") {
                    self.morning.toggle()
                }
            }
        }
    }
    
    
```

(2) `@Binding`を使ってふたつの`View`の間で変数を紐付け

```

    struct ContentView: View {
        @State private var morning: Bool = false
    
        var body: some View {
            VStack {
                Greeting(morning: $morning) // <-
                Button(action: {
                    self.morning.toggle()
                }) {
                    Text("tap")
                }
    
            }
        }
    }
    
    struct Greeting: View {
        @Binding var morning: Bool // <- @Binding
    
        var body: some View {
            VStack {
                if morning {
                    Text("Good morning")
                } else {
                    Text("hello")
                }
            }
        }
    }
    
```
CC BY-SA 4.0
2020-02-13T20:12:18.433
63029
2020-02-13T20:12:18.433
27795
63026
answer