blitz-time アプリ開発ブログ

Androidアプリ開発などのTips集

【SwiftUI開発】Return from initializer without initializing all stored properties

Viewのinitの処理をカスタマイズしたいと思い、下記のようなコードを書きました。

struct TestView: View {
    
    @State var number: Float
    @State var number2: Float
    
    init(number: Float) {
        self.number = number
    }
    
    var body: some View {
        VStack{
            Text("number: \(number2)")
        }
        .onAppear(){
            number2 = number * 2
        }
    }
}

すると、initの箇所で、

Return from initializer without initializing all stored properties

のエラーが出ました。

「全てのプロパティが初期化されない状態で、init()を終了できません。」

という意味ですね。

number2が初期化されていない状態を指摘されています。

初期化されていないプロパティがあれば初期化を済ませましょう。


なお、余談ではありますが、@Stateのプロパティに初期値が設定されている状態では、init内でプロパティに値を代入することができません。

struct TestView: View {
    
    @State var number: Float
    @State var number2: Float = 1.0
    
    init(number: Float) {
        self.number = number
        self.number2 = 4.0
    }
    
    var body: some View {
        VStack{
            Text("number: \(number2)")
        }
    }
}

上記のコードでは、「number: 1.0」と表示されます。
init内での「self.number2 = 4.0」が反映されていません。ビルドエラーや実行エラーが出るわけではありません。

どうしてもinit内で初期化された@Stateのプロパティを再設定したい場合は、下記の手法が有効です。

    @State var number: Float
    @State var number2: Float = 1.0
    
    init(number: Float) {
        self.number = number
        self._number2 = State.init(initialValue: Float(4.0))
    }


SwiftUIで開発したアプリをご紹介しておきます。
appdev.blitz-time.com