假设我有一个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)
}
}
但是,这将返回错误:
函数声明了一个不透明的返回类型,但是在其主体中没有用于从其推断基础类型的返回语句
有什么办法可以做到这一点吗?
答案 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{ ...}
有点脏又脏,但这对我有用。