在SwiftUI中将视图声明为视图主体内的变量时,出现“函数声明不透明的返回类型[...]”错误

时间:2019-06-08 11:46:57

标签: swift 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)
    }
}

但是,这将返回错误:

  

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

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

5 个答案:

答案 0 :(得分:9)

在修改和构建视图时,您可以在不使用return语句的情况下执行此操作,而在一个构建块之上则无需逗号。这称为多语句闭包。当您尝试在多语句闭包内创建变量时,编译器会抱怨,因为类型不匹配(您只能一个接一个地合并视图,没有其他)。有关更多详细信息,请参见以下答案:https://stackoverflow.com/a/56435128/7715250

解决此问题的一种方法是显式返回要合并的视图,因此您不必使用多闭包语句:

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

答案 1 :(得分:1)

您可以在体外定义图像:

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

答案 2 :(得分:1)

我正在使用 Group {}

func makeContentView() -> some View {
    Group {
        if some_condition_here {
            Text("Hello World")
                .foregroundColor(.red)
                .font(.system(size: 13, weight: .bold, design: .monospaced))
            } else {
                Rectangle()
                    .fill(Color.gray20)
            }
        }
    }
}

答案 3 :(得分:0)

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

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

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

    return stack
}

答案 4 :(得分:0)

在测试环境中发生这种情况时,我会将一切都嵌套在一个内部

    return ZStack{ ...}

有点脏又脏,但这对我有用。