SwiftUI闭包主体中的语句导致类型错误

问题描述 投票:2回答:2

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

.background(GeometryReader { p in
    return Rectangle().opacity(0)
})

((我知道我不需要退货,但是我要添加另一行。)

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

.background(GeometryReader { p in
    print("hi")
    return Rectangle().opacity(0)
})

错误指向background并说:

表达式类型'(_,对齐)->某些视图'含糊不清,没有更多上下文

我不明白为什么现在对于传递给.background(...)的事物类型感到困惑。它具有与以前相同的清晰return表达式。如何修复代码以满足类型检查器的要求?

swiftui
2个回答
3
投票

发生此错误是因为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,它添加了一个名为ViewPrint。我想您可以在Group中将其中之一与设置背景的任何视图放在一起。


1
投票

编写我自己的修饰符,我能够为视图创建背景。 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()
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.