在 iOS 15 中选择退出 SwiftUI 文本 Markdown 支持

Opt out of SwiftUI Text Markdown Support in iOS 15

假设我想在 Text 中向用户显示以下文本:

3+4*5, 6*7+8

iOS15 中的新 SwiftUI 行为将在 Markdown 中呈现此字符串,使中间部分变为斜体。

看这里:Hacking with Swift

我可以做到这一点并且它适用于 iOS 15:

Text("3+4\*5, 6\*7+8")

但是在iOS14上,由于没有Markdown解析会显示如下:

3+4\*5, 6\*7+8

有没有办法选择退出 Markdown 解析,这样我就可以使用单个字符串定位 iOS 15 和 14?

您可以使用 verbatim 初始值设定项创建 Text

Text(verbatim: “1*2 = 2*1”)

iOS13 支持此功能,将绕过所有转换和本地化。

https://developer.apple.com/documentation/swiftui/text/init(verbatim:)

取决于您使用的初始化程序,将取决于它是否会呈现 markdown。您不需要使用转义字符,只需以正确的方式设置字符串即可。

这里详细介绍了在有或没有本地化的情况下如何使用或不使用 markdown。

  1. 如果您使用默认值 Text() 并直接将字符串传递给它,那么它会假设您传递的是 LocalizedStringKey 并且它将本地化​​并使用记下来。您可以阅读更多 here.

  2. 如果您将字符串作为变量,那么 SwiftUI 将在您使用实际 String 的地方使用 Text() 初始值设定项,并且它将在没有本地化和降价的情况下呈现它.您可以阅读更多 here.

  3. 如果您使用 Text(verbatim:) 那么它将不使用本地化和降价。您可以阅读更多 here.

  4. 如果您想使用本地化但不使用 markdown,那么您需要使用 String(localized:) 创建一个 localizedString,然后将其传递给 Text()。您可以阅读更多 here.

struct ContentView: View {

    let stringVariable = "This is *markdown*"

    let localizedString = String(localized: "This is *markdown*")

    var body: some View {
        VStack(spacing: 20) {

            // 1
            // Localization with markdown
            // https://developer.apple.com/documentation/swiftui/text/init(_:tablename:bundle:comment:)
            Text("This is *markdown*")

            // 2
            // No localization no markdown
            // https://developer.apple.com/documentation/swiftui/text/init(_:)-9d1g4
            Text(stringVariable)

            // 3
            // No localization no markdown
            // https://developer.apple.com/documentation/swiftui/text/init(verbatim:)
            Text(verbatim: "This is *markdown*")

            // 4
            // This is a localized string but no markdown
            // https://developer.apple.com/documentation/swift/string/3867985-init
            Text(localizedString)
        }
    }
}

上面的结果如下