返回

SwiftUI 中的 Text 插值和本地化(下)

IOS

深入理解 SwiftUI 中的 Text 插值和本地化

在 SwiftUI 中,Text 控件是处理文本内容的强大工具,它提供了广泛的功能,可以轻松地将变量、常量和动态数据嵌入到文本中。

数据类型和插值

Text 控件可以接受各种数据类型,包括:

  • 字符串:字符串是 Text 控件最常见的输入。
  • 图像:我们可以将图像直接嵌入文本中,为文本添加可视元素。
  • 日期:Text 控件可以格式化和显示日期和时间信息。

为了将这些数据类型嵌入到文本中,我们使用插值,这是一种使用花括号将变量和表达式嵌入到字符串文字中的技术。例如:

let name = "John"
let greeting = "Hello, \(name)!"

自定义类型

虽然 Text 控件无法直接接受自定义类型,但我们可以通过创建符合 Swift 接受类型之一(如 String 或 NSAttributedString)的包装器来解决这个问题。例如,对于一个表示人员信息的自定义类型 Person

struct Person {
    let name: String
    let age: Int
}

let person = Person(name: "John", age: 30)

let personString = "\(person.name), \(person.age)" // 转换为 String
let attributedString = NSAttributedString(string: "\(person.name)", attributes: [.foregroundColor: .blue]) // 转换为 NSAttributedString

复杂格式

当需要处理复杂格式的文本时,我们可以使用 Text 控件提供的修饰符:

  • .formatter(DateFormatter): 用于格式化日期和时间。
  • .formatter(NumberFormatter): 用于格式化数字和货币。

例如,格式化日期:

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full

let formattedDate = date.formatted(dateFormatter)

本地化文本

对于多语言应用程序,本地化文本至关重要。SwiftUI 提供了以下机制:

  • LocalizedStringKey: 用于存储可本地化的文本键。
  • NSLocalizedString: 用于获取已本地化的文本。

例如,本地化欢迎消息:

let welcomeMessageKey = LocalizedStringKey("WelcomeMessage")

// 在 Info.plist 中添加翻译:
<key>WelcomeMessage</key>
<string>Welcome</string>

let welcomeMessage = NSLocalizedString(welcomeMessageKey, comment: "")

可访问性

对于有视力障碍或阅读困难的用户,可访问性至关重要。SwiftUI 提供了以下功能:

  • .accessibility(label:): 提供辅助标签,以便屏幕阅读器可以读取文本。
  • .accessibility(hint:): 提供辅助提示,以提供有关文本的更多上下文信息。
  • .accessibility(value:): 用于格式化文本以更易于访问性工具解释。

代码示例

import SwiftUI

struct ContentView: View {
    let name = "John"
    let date = Date()
    let number = 123.45
    let person = Person(name: "John", age: 30)

    var body: some View {
        VStack {
            // 基本插值
            Text("Hello, \(name)!")

            // 自定义类型插值
            Text(personString) // 转换为 String
            Text(attributedString) // 转换为 NSAttributedString

            // 复杂格式化
            Text(date, formatter: dateFormatter)
            Text(number, formatter: NumberFormatter())

            // 本地化文本
            Text(welcomeMessage)

            // 可访问性
            Text("Welcome, \(name)!")
                .accessibility(label: "Welcome message")
                .accessibility(hint: "This is a welcome message for the user.")
                .accessibility(value: "Welcome, John!")
        }
    }
}

常见问题解答

  1. 如何将图像嵌入到文本中?

    • 使用 Image() 视图并将其包裹在 Text() 中。
  2. 如何将格式化后的数字转换为字符串?

    • 使用 String(format:) 方法,例如 String(format: "%.2f", number)
  3. 如何为本地化文本提供多个翻译?

    • Info.plist 中使用 Localizable.strings 文件为不同语言添加翻译。
  4. 如何处理换行符?

    • 使用 \n 字符或 Text(verbatim:) 初始化器。
  5. 如何对文本进行样式化?

    • 使用 font()foregroundColor()fontWeight() 修饰符。