SwiftUI 中,类似 Text(resort.facilities, format: .list(type: .and)) 这样格式化数据为自然语言输出的方法或功能,通常是基于 FormatStyle 系统扩展的。这些功能帮助开发者将数据类型直接转换为用户友好的文本,避免手动拼接字符串,并且支持国际化和区域设置。
1、数字格式化:NumberFormatStyle
用于格式化数字,例如货币、百分比、小数等。
示例:
Text(123456.789, format: .number.precision(.fractionLength(2)))
// 输出: "123,456.79"
Text(0.45, format: .percent)
// 输出: "45%"
Text(9999, format: .currency(code: "USD"))
// 输出: "$9,999.00" (根据设备区域设置可能有所不同)
用途:
显示货币金额(currency)
显示百分比(percent)
设置数字精度(precision)
2、日期和时间格式化:DateFormatStyle
用于将 Date 格式化为用户友好的日期字符串。
示例:
Text(Date(), format: .dateTime.year().month().day())
// 输出: "2024年12月23日" (基于设备语言)
Text(Date(), format: .dateTime.hour().minute())
// 输出: "15:30"
Text(Date(), format: .dateTime.weekday().hour().minute())
// 输出: "Monday 15:30" (或中文 "周一 15:30")
用途:
显示日期和时间(dateTime)
显示特定组件(如年、月、日、时、分)
国际化日期显示
3、测量值格式化:MeasurementFormatStyle
格式化物理测量值,如距离、重量、温度等。
示例:
let distance = Measurement(value: 42, unit: UnitLength.kilometers)
Text(distance, format: .measurement(width: .abbreviated))
// 输出: "42 km"
let temperature = Measurement(value: 25, unit: UnitTemperature.celsius)
Text(temperature, format: .measurement(width: .narrow))
// 输出: "25°C"
用途:
显示距离(UnitLength)
显示温度(UnitTemperature)
显示重量(UnitMass)
4、列表格式化:ListFormatStyle
格式化数组或集合为自然语言列表。
示例:
let items = ["Apples", "Oranges", "Bananas"]
Text(items, format: .list(type: .and))
// 输出: "Apples, Oranges, and Bananas"
5、字符串格式化:LocalizedStringKey
支持本地化字符串和动态占位符替换。
示例:
Text("Hello, \(name)! Welcome to \(place).")
// 输出: "Hello, John! Welcome to New York."
// 本地化版本可能输出:
// "你好,John!欢迎来到纽约。"
6、比率和分数格式化:FractionFormatStyle
用于以分数表示数字。
示例:
Text(0.75, format: .number.notation(.fraction))
// 输出: "3/4"
Text(1.2, format: .number.notation(.scientific))
// 输出: "1.2E0"
7、动态区间格式化:RangeFormatStyle
用于格式化数值区间。
示例:
let range = 1...10
Text(range, format: .number)
// 输出: "1–10"
8、数据大小格式化:ByteCountFormatStyle
用于显示文件或数据大小。
示例:
let fileSize = 10485760
Text(fileSize, format: .byteCount(style: .file))
// 输出: "10 MB"
用途:
显示存储大小
支持不同单位(KB、MB、GB 等)
9、时间间隔格式化:RelativeDateTimeFormatter
格式化时间间隔为自然语言描述。
示例:
Text(Date.now, format: .relative(presentation: .numeric))
// 输出: "5 minutes ago" 或 "5分钟前"
Text(Date.now.addingTimeInterval(-3600), format: .relative(presentation: .named))
// 输出: "1 hour ago" 或 "1小时前"
10、自定义格式化器:CustomFormatStyle
可以根据需求创建自己的格式化器。
示例:
struct ReverseStringFormatStyle: FormatStyle {
func format(_ value: String) -> String {
String(value.reversed())
}
}
extension FormatStyle where Self == ReverseStringFormatStyle {
static var reverse: ReverseStringFormatStyle { ReverseStringFormatStyle() }
}
Text("Swift", format: .reverse)
// 输出: "tfiwS"
总结
Swift 的格式化工具种类丰富,涵盖了数字、日期、列表、测量值等常见需求。选择合适的格式化器不仅能简化代码,还能提高可读性和用户体验,同时保证国际化支持。