Есть ли способ условно использовать @StateObject при нацеливании на iOS 13? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть приложение SwiftUI, ориентированное на iOS 13 и выше. Я хотел бы условно использовать оболочку свойств @StateObject, если я работаю на iOS 14, так как это исправит так много ошибок, которые мне пришлось исправить на iOS 13.

Есть ли какие-либо способ условно сделать это через вызовы #ifdef или #if available(iOS 14, *) или аналогичные? Я счастлив иметь полностью отдельную реализацию данного представления для iOS 14.

Я пробовал это, но он, конечно, не компилируется.

struct MyView: View {
    if #available(iOS 14, *) {
        @StateObject var viewModel: ViewModel()
    } else {
        @ObservedObject var viewModel: ViewModel
    }

1 Ответ

0 голосов
/ 06 августа 2020

Это можно сделать с помощью атрибута @available, например:

class ViewModel: ObservableObject {}

@available(iOS 14, *)
struct FourteenView: View {
    @StateObject var viewModel = ViewModel()
    var body: some View {
        Text("iOS 14")
    }
}

struct ThirteenView: View {
    @ObservedObject var viewModel = ViewModel()
    var body: some View {
        Text("iOS 13")
    }
}

struct ContentView: View {
    var body: some View {
        if #available(iOS 14, *) {
            AnyView(FourteenView())
        } else {
            ThirteenView()
        }
    }
}

Конечно, это работает только в Xcode 12. Я использую 12.0 beta 3 (12A8169g).

AnyView() в ContentView потому, что использование if #available(iOS 14, *) в @ViewBuilder не работает должным образом. См. Эту ветку форума разработчиков Apple .

...