SwiftUI Edit/override 应用程序中的所有警报

SwiftUI Edit/override all Alerts across the app

由于在许多屏幕上处理错误的特定情况,我的应用程序中有很多警报,现在我需要在任何警报显示时显示时间,有没有办法edit/override 提醒所以它只包括调试时间?

例如,我可以通过以下方式为所有打印件实现此目的:

import Foundation

func print(_ items: Any..., separator: String = " ", terminator: String = "\n"){
    #if DEBUG
    let df = DateFormatter()
    df.dateFormat = "yyyy-MM-dd HH:mm:ss"
    Swift.print( df.string(from: Date()) )
    items.forEach{
        Swift.print([=11=], separator: separator, terminator: terminator)
    }
    #endif
}

但是如何在不将每个实例都更改为另一个元素的情况下覆盖像 Alert 这样的东西?

我会推荐你只写一个函数,用一个正常的名字,比如customAlert(...)。这更清楚地表明它是自定义的,而且该函数有一个很好的命名方案,与调用它 Alert 不同。 Alert 是不明确的,并且使用完全相同的参数,你会得到一个编译时错误。一旦您将 Alert 的所有实例重命名为 customAlert,您将永远不必再次进行此更改。

示例:

func customAlert(title: Text, message: Text? = nil, dismissButton: Alert.Button? = nil) -> Alert {
    func alertMessage() -> Text? {
        #if DEBUG
        let df = DateFormatter()
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let date = "Date: \(df.string(from: Date()))"

        if let message = message {
            return Text("\(date)\n\n") + message
        } else {
            return Text(date)
        }
        #else
        return message
        #endif
    }

    return SwiftUI.Alert(title: title, message: alertMessage(), dismissButton: dismissButton)
}

用法:

struct ContentView: View {
    @State private var presentAlert = false

    var body: some View {
        Button("Present alert") {
            presentAlert = true
        }
        .alert(isPresented: $presentAlert) {
            customAlert(title: Text("Title"), message: Text("Message"))
        }
    }
}