62444


例えば以下のような場合、`Toggle`の`isOn`に対して`$like`を代入しなければならないと思いますが、なぜドルマーク`$`がつくのでしょうか？
**`$`をつける文法がよくわかりません。**

[code]

    @State var like = true
    Toggle(isOn: $like){
       Text("Like or Not").font(.largeTitle)
    }
    
[/code]


CC BY-SA 4.0
2020-01-21T17:23:44.083
62443
2020-01-21T22:24:03.713
2020-01-21T22:14:21.893
19110
37250
question
swift swiftui
SwiftUIのToggleのisOnに指定するBool値になぜドルマーク$を付けなければいけないのかがわからない


`@State`のようなアトリビュートは、Swift 5.1 (Xcode 11)で初めて導入されたもので、[property
wrapper](https://github.com/apple/swift-
evolution/blob/master/proposals/0258-property-wrappers.md)と呼ばれます。

次の1行の宣言文は、

[code]

    @State var like = true
    
[/code]

Swiftコンパイラ内部で次のような宣言に変換されてコンパイルされます。

[code]

        private var _like: State<Bool> = State(wrappedValue: true)
        var like: Bool {
            get {
                return _like.wrappedValue
            }
            set {
                _like.wrappedValue = newValue
            }
        }
        var $like: Binding<Bool> {
            get {
                return _like.projectedValue
            }
        }
    
[/code]

(通常のプログラムからは`$like`のような`$`始まりの識別子を宣言することは出来ません。)

このように`@State var like =
true`と言う宣言は、`Bool`型の変数を宣言しているように見えて、実は[`State<Bool>`型](https://developer.apple.com/documentation/swiftui/state)の変数を宣言している訳です。

で、Swiftのproperty
wrapperの場合、見かけのデータ型を包み込んでいる`State`のようなデータ型を便利に使うためのプロパティを1つだけ定義することができて、projection
(投影)と呼ばれています。

つまり、

**`$like`はSwiftが自動生成した投影プロパティで、`like`の内側の`State<Bool>`型を便利に使うためのもの**

と言うことになります。

* * *

`State`と言うのは、SwiftUIにおいて状態変数を管理しやすくするためのデータ型である訳ですが、その投影データ型は[`Binding<Value>`(今の場合、`Binding<Bool>`)型](https://developer.apple.com/documentation/swiftui/binding)になります。

渡している先の`Toggle`型のイニシャライザも`Binding<Bool>`を受け取るものとして宣言されています。

[`init(isOn: Binding<Bool>, @ViewBuilder label: () ->
Label)`](https://developer.apple.com/documentation/swiftui/toggle/3232112-init)

この`Binding<Bool>`と言うのは、働き的にはポインタか参照のようなもので、渡した時の値ではなく最新の値を取り出したり、値を変更したりすることができます。それで`Toggle`を操作した結果を元の`like`に反映することができる訳です。

* * *

SwiftUI絡みの機能については、Swift言語に関して公開されている情報以外に、Appleの独自拡張が含まれる場合もあるので、詳細まで突き詰めていくと上の説明とは若干整合性のない動作が見つかるかもしれませんが、通常の使い方をしている分にはこの説明で問題ないと思います。


CC BY-SA 4.0
2020-01-21T22:24:03.713
62444
2020-01-21T22:24:03.713
13972
62443
answer