SwiftUI视图上的此修饰符可以很好地编译:
.background(GeometryReader { p in
return Rectangle().opacity(0)
})
((我知道我不需要退货,但是我要添加另一行。)
当我添加print
调用时,它将不再编译。
.background(GeometryReader { p in
print("hi")
return Rectangle().opacity(0)
})
错误指向background
并说:
表达式类型'(_,对齐)->某些视图'含糊不清,没有更多上下文
我不明白为什么现在对于传递给.background(...)
的事物类型感到困惑。它具有与以前相同的清晰return
表达式。如何修复代码以满足类型检查器的要求?
发生此错误是因为multi-statement closures don't take part in type inference。无法推断出Content
的初始化程序的GeometryReader
通用参数,因为您提供给它的唯一信息(闭包)不被考虑用于类型推断!
所以您只需要指定返回的类型:
.background(GeometryReader {
p -> Rectangle in // note here
print("Hello")
return Rectangle()
})
但是您可能不应该这样做,因为您应该只将View
放入视图构建器闭包中。我会说,SwiftUI的设计具有很高的声明性,几乎是自己的DSL。
编辑:我发现this answer,它添加了一个名为View
的Print
。我想您可以在Group
中将其中之一与设置背景的任何视图放在一起。
编写我自己的修饰符,我能够为视图创建背景。 Sweeper我认为有一个正确的主意,您需要添加return语句,因为几何读取器不再是单行隐式返回。
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()
}
}