web-dev-qa-db-ja.com

SwiftUIでビューの本体内の変数としてビューを宣言すると、「関数は不透明な戻り値の型[...]を宣言します」エラー

Viewプロパティを持つImageを持つshadowがあるとします。

struct ContentView: View {
    var body: some View {
        Image("turtlerock").shadow(radius: 10)
    }
}

シャドウ半径の値にアクセスしたいとします。私はこれを行うことができると思いました:

struct ContentView: View {
    var body: some View {
        let myImage = Image("turtlerock").shadow(radius: 10)
        print(myImage.modifier.radius)
    }
}

ただし、これはエラーを返します。

関数は不透明な戻り値の型を宣言しますが、基になる型を推測するための本文にreturnステートメントがありません

どういうわけかこれを達成する方法はありますか?

16
Tamás Sengel

ビューを変更および構築する場合、returnステートメントなしでこれを行うことができ、ビルディングブロックをコンマなしで上下に重ねることができます。これは、複数ステートメントのクロージャーと呼ばれます。マルチステートメントクロージャー内に変数を作成しようとすると、型に不一致があるため、コンパイラーは文句を言うでしょう(ビューを1つずつ組み合わせることができる、何もない)。詳細については、この回答を参照してください: https://stackoverflow.com/a/56435128/771525

これを修正する方法は、結合しているビューを明示的に返すことです。そのため、複数の閉鎖ステートメントを使用しません。

struct MyView: View {
    var body: some View {
        let image = Image("Some image").shadow(radius: 10)
        let myRadius = image.modifier.radius

        // Do something with myRadius

        return image // No multi closure statements.
    }
}
26
J. Doe

参照するビューがスタック内にある場合は、次のように宣言する必要がありますスタック外

var body: some View {
    let myImage = Image("image").shadow(radius: 10)

    let stack = HStack {
        myImage
        Image("image2")
    }

    return stack
}
3
Tamás Sengel

ボディの外側の画像を定義できます:

let myImage = Image("turtlerock").shadow(radius: 10)

var body: some View {
  myImage
}

半径を印刷するには、次のようにします。

var body: some View {
  myImage
    .tapAction {
      print(self.myImage.modifier.radius) // 10.0
  }
}

それがテスト環境で私に起こったとき、私は身体のすべてを

    return ZStack{ ...}

少し速くて汚いですが、それは私の目的のために機能します。

0
jpelayo