SwiftUI闭包正文中的语句导致类型错误

SwiftUI闭包正文中的语句导致类型错误,swiftui,Swiftui,SwiftUI视图上的此修饰符可以很好地编译: .background(GeometryReader { p in return Rectangle().opacity(0) }) (我知道我不需要退货,但我准备再加一行。) 当我添加print调用时,它不再编译 .background(GeometryReader { p in print("hi") return Rectangle().opacity(0) }) 错误指向background,并显示: 表达式类型

SwiftUI视图上的此修饰符可以很好地编译:

.background(GeometryReader { p in
    return Rectangle().opacity(0)
})
(我知道我不需要退货,但我准备再加一行。)

当我添加
print
调用时,它不再编译

.background(GeometryReader { p in
    print("hi")
    return Rectangle().opacity(0)
})
错误指向
background
,并显示:

表达式类型“(,对齐)->某些视图”在没有更多上下文的情况下不明确

我不明白为什么它现在对传递给
.background(…)
的内容类型感到困惑。它得到了与以前相同的clear
return
表达式。如何修复代码以满足类型检查器的要求?

发生此错误的原因是。无法推断
GeometryReader
的初始化器的
Content
泛型参数,因为您提供给它的唯一信息闭包不考虑用于类型推断

因此,您只需指定返回的类型:

.background(GeometryReader {
    p -> Rectangle in // note here
    print("Hello")
    return Rectangle()
})
但您可能不应该这样做,因为您应该只在视图生成器闭包中放置
视图
s。SwiftUI的设计非常具有声明性,我想说,它几乎是自己的DSL


编辑:我找到了,它添加了一个名为
Print
视图。我想你可以把其中一个放在你正在设置背景的任何视图旁边,在一个
组中

编写我自己的修改器,我可以为视图创建背景。我认为Sweeper的想法是正确的,您需要添加一个return语句,因为geometry reader不再是单行隐式返回

extension View {
  func myBackground() -> some View {
    print("hi")
    return background(GeometryReader { geometry in
      Rectangle().path(in: geometry.frame(in: .local))
    })
  }
}
然后我在下面的上下文中测试了修饰符

struct ContentView: View {

  var body: some View {
    Text("Foreground Label").foregroundColor(.green).myBackground()
  }

}

对不起,正如你回答的那样,我编辑了我的问题。你的答案有效,但现在我添加了
.opacity
修改器,我不知道该使用哪种类型。编写
某些视图
代替
矩形
并不能将其剪切。@RobN这就是为什么不应该编写其他语句来创建视图。您应该只编写
视图
s,并且只在视图生成器闭包中编写
视图
s。您可以使用
if…else
语句,但这就是您拥有的所有控件。正如您可能已经发现的那样,实际上您不能声明变量,也不能在视图生成器中执行for/while循环,
print
。好的,我可以根据需要调整
print
视图。最初的函数构建器设计方案是在Swift论坛()上链接的,它允许更多的东西,比如局部变量。所以我认为其中的一些限制只是因为它目前都实现了一半,并不是说你不能写变量声明。我说“实际上不能”,因为无论何时,在类型推断中闭包都会被忽略。该类型可能仍然能够通过其他方式进行推断,但由于通常使用视图生成器的上下文(不透明返回类型),类型推断几乎总是失败的。