SwiftUI视图上的此修饰符可以正常编译:
.background(GeometryReader { p in
return Rectangle().opacity(0)
})
(我知道我不需要退货,但是我要添加另一行。)
当我添加print
呼叫时,它将不再编译。
.background(GeometryReader { p in
print("hi")
return Rectangle().opacity(0)
})
错误指向,background
并说:
表达式类型'(_,对齐方式->某些视图')含糊不清,没有更多上下文
我不明白为什么现在对传递给的东西的类型感到困惑.background(...)
。它具有与return
以前相同的清晰表达。如何修复代码以满足类型检查器的要求?
发生此错误是因为多语句闭包不参与类型推断。无法推断Content
的初始化程序的通用参数,GeometryReader
因为您提供给它的唯一信息(闭包)不会考虑类型推断!
因此,您只需要指定返回的类型:
.background(GeometryReader {
p -> Rectangle in // note here
print("Hello")
return Rectangle()
})
但是,您可能不应该这样做,因为您应该只将View
s放入视图构建器闭包中。我想说,SwiftUI的设计非常具有声明性,几乎是自己的DSL。
编辑:我发现这个答案,还增加了一个View
叫Print
。我想您可以在其中设置背景的任何视图旁边放置其中之一Group
。
抱歉,我在您回答时就编辑了我的问题。您的答案起作用了,但是现在我添加了
.opacity
修饰符,不知道要使用哪种类型。some View
代替写作Rectangle
并没有减少它。@RobN这就是为什么您不应该编写其他语句视图构建器的原因。您应该
View
只View
在视图构建器闭包中编写s,而仅写s 。您可以有if...else
语句,但这就是您拥有的所有控件。您可能已经发现,您实际上无法声明变量,也无法在视图构建器中执行for / while循环,for也是如此print
。好的,我可以
Print
根据自己的需要调整视图。在Swift论坛(forums.swift.org/t/function-builders/25167)上链接的针对函数构建器的原始设计建议具有更多的允许范围,例如局部变量。因此,我认为其中一些限制只是目前已全部实施了一半。嗯,这并不是说您实际上不能编写变量声明。我说“实际上不能”,因为只要您这样做,闭包都会在类型推断中被忽略。也许仍然可以通过其他方式来推断类型,但是由于通常使用视图构建器的上下文(不透明的返回类型),类型推断几乎总是失败。