Как обернуть #available в это настраиваемое расширение .if в представлении SwiftUI?

Я использую это расширение, которое отлично работает и должно быть добавлено в 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, *)) { $0.refreshable {
                        
                    } }

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

1 ответ

Решение

Я обычно просто делаю .if(true)а затем проверьте наличие внутри укупорки. К сожалению, мы не можем проверить наличие в модификаторе.

Пример:

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

Добавлен @ViewBuilder к transform параметр, чтобы вы могли вернуть разные View типы в if:

      extension View {
    @ViewBuilder func `if`<Transform: View>(_ condition: Bool, @ViewBuilder transform: (Self) -> Transform) -> some View {
        if condition {
            transform(self)
        } else {
            self
        }
    }
}
Другие вопросы по тегам