如何在 SwiftUI 视图的这个自定义 .if 扩展中包装#available?

How to wrap #available in this custom .if extension on a SwiftUI View?

我正在使用这个 .if 扩展,效果很好,应该添加到 SwiftUI,但是在这种情况下它无法检查 #available 因为 #available may only be used as condition of an 'if', 'guard' or 'while' statement 怎么能无论如何,我让它与这个 .if 一起工作?

    //Does not compile for #available may only be used as condition of an 'if', 'guard' or 'while' statement
   ForEach...
   .if(#available(iOS 15.0, *)) { [=10=].refreshable {
                        
                    } }

extension View {
  @ViewBuilder
  func `if`<Transform: View>(
    _ condition: Bool,
    transform: (Self) -> Transform
  ) -> some View {
    if condition {
      transform(self)
    } else {
      self
    }
  }
}

我通常只做 .if(true) 然后检查闭包内的可用性。遗憾的是,我们无法在 if 修饰符中检查可用性。

示例:

struct ContentView: View {
    var body: some View {
        List {
            Text("Hello")
            /* More list items... */
        }
        .if(true) {
            if #available(iOS 15, *) {
                [=10=].refreshable {
                    //
                }
            } else {
                [=10=]
            }
        }
    }
}

已将 @ViewBuilder 添加到 transform 参数,因此您可以在 if:

中 return 不同的 View 类型
extension View {
    @ViewBuilder func `if`<Transform: View>(_ condition: Bool, @ViewBuilder transform: (Self) -> Transform) -> some View {
        if condition {
            transform(self)
        } else {
            self
        }
    }
}