&引用;函数声明不透明的返回类型[…]”;在SwiftUI中将视图声明为视图主体内的变量时出错

&引用;函数声明不透明的返回类型[…]”;在SwiftUI中将视图声明为视图主体内的变量时出错,swift,swiftui,Swift,Swiftui,假设我有一个视图,其图像具有阴影属性: struct ContentView: View { var body: some View { Image("turtlerock").shadow(radius: 10) } } 现在假设我想要访问阴影半径的值。我想我可以做到这一点: struct ContentView: View { var body: some View { let myImage = Image("turtlerock"

假设我有一个
视图
,其
图像
具有
阴影
属性:

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)
    }
}
但是,这将返回一个错误:

函数声明了一个不透明的返回类型,但在其主体中没有可以推断基础类型的返回语句


有什么方法可以做到这一点吗?

在修改和构建视图时,不需要返回语句,也不需要构建块,而不需要逗号。这称为多语句闭包。当您尝试在多语句闭包中创建变量时,编译器会抱怨,因为类型不匹配(您只能逐个组合视图,仅此而已)。有关更多详细信息,请参阅此答案:

解决此问题的一种方法是显式返回要组合的视图,因此不使用multi-closure语句:

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.
    }
}

您可以在主体外部定义图像:

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
  }
}

如果要引用的视图位于堆栈内部,则应在堆栈外部声明它,如下所示:

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

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

    return stack
}

当它发生在我的测试环境中时,我只是将所有东西都嵌套在一个

return ZStack{ ...}

有点快,有点脏,但它对我的目的有效。

我正在使用
组{}

func makeContentView()->一些视图{
团体{
如果这里有某种情况{
文本(“你好,世界”)
.foregroundColor(.red)
.font(.system(大小:13,重量:粗体,设计:等距))
}否则{
矩形()
.填充(颜色.灰色20)
}
}
}
}

这个答案也是正确的
print(self.myImage.modifier.radius)//10.0
为什么要投反对票?@PrashantTukadiya我把这个答案投了赞成票,其他人把它投了反对票。非常感谢,你已经解释清楚了!我编辑了我的原始问题,只解决了一个问题,我将创建第二个问题,处理访问修饰符变量的问题。我建议编辑此答案,只包含下半部分,并在另一个问题的答案中包含有关访问修饰符的信息。下面是另一个问题: