【SwiftUI】@State変数の初期値をinit内で代入する方法

iOS

@Stateをつけた変数について、init()で初期値を設定するときの書き方を忘れがちなのでメモしておきます。

1.@State変数を定義

今回は例としてBool値のisOpenという変数を定義します。

struct hoge : View {
    @State private var isOpen : Bool
    
    init(isOpen : Bool) {
        self.isOpen = isOpen //←エラーになる
        //Variable 'self.isOpen' used before being initialized
    }

    var body some View {
     //省略
    }
}

普通の変数と同様にinit内で初期値をいれるとエラーが出ます。

2.init内の左辺を書き換える

self.isOpenを_isOpenに書き換えます。

struct hoge : View {
    @State private var isOpen : Bool
    
    init(isOpen : Bool) {
        _isOpen = isOpen //←エラーになる
        //Cannot assign value of type 'Bool' to type 'State<Bool>'
    }

    var body some View {
     //省略
    }
}

まだ型が合わないと言われるので、右辺も修正します。

3.右辺をState(initialValue:)に書き換える

struct hoge : View {
    @State private var isOpen : Bool
    
    init(isOpen : Bool) {
        _isOpen = State(initialValue:isOpen) //←OK
    }

    var body some View {
     //省略
    }
}

左辺がState<Bool>型で右辺がBool型だったので、右辺もState<Bool>型に変えます。

これで@State変数の初期値をinit内で代入できるようになりました。

コメント