Отображение ошибок в приложении macOS с помощью SwiftUI

#swift #macos #swiftui #macos-big-sur

Вопрос:

Я пытаюсь понять, как лучше всего отображать ошибки или вещи, которые не совсем соответствовали плану в приложении macOS Big Sur.

Например, у меня есть функция, которая откроет каталог, в котором находятся файлы, сохраненные приложением, однако бывают случаи, когда это не работает из-за пустого URL-адреса или других ошибок, и я не могу понять, как продемонстрировать это пользователю. Эта функция заключается в следующем:

 func showInFinder(url: URL?) {
    guard let url = url else {
        print("returning... URL nil ")
        return
    }
    NSWorkspace.shared.selectFile(nil, inFileViewerRootedAtPath: url.path)
}
 

Я думал о том, чтобы отобразить предупреждение, например:

 struct ContentView: View {
    @State var showsAlert = false
    var body: some View {
        Button(action: {
            self.showsAlert.toggle()
        }) {
            Text("Show Alert")
        }
        .alert(isPresented: self.$showsAlert) {
            Alert(title: Text("Hello"))
        }
    }
}
 

Но в большинстве мест, где мне нужно, чтобы ошибка отображалась в функциях, а не в представлениях. Если только я не смогу отобразить их на нажимаемых кнопках или на таких действиях, как onAppear() .

Есть какие-нибудь предложения? Специально для функций.

Комментарии:

1. .alert только для представлений SwiftUI он не будет работать в функции или прикреплен к функции. Вы можете использовать .alert(item:) для отправки пользовательского объекта с информацией, необходимой для предупреждения, такой как заголовок и сообщение, в модель общего представления, чтобы предупреждение отображалось вместе с пользовательским сообщением. .alert является модификатором представления, в котором он нуждается View .

2. Итак, по сути, мне нужно просмотреть возврат функции (bool, int и т. Д.) И решить, что что-то пошло не так, а затем отобразить предупреждение? Могу ли я иметь более одного предупреждения на просмотр?

3. Да, вам нужно оценить, и нет, у вас не может быть более одного предупреждения, потому что они присутствуют в одном и том же месте, и у вас будут ошибки. Как я уже сказал alert(item) , это позволит вам использовать пользовательский объект, такой как a struct , который должен иметь переменную title и message с пользовательской информацией.