1. Swift 语言的强大特性
Swift 是一种功能强大的编程语言,提供了许多内置的便利特性,帮助开发者编写简洁、高效且可读性强的代码。随着每个新版本的发布,Swift 语言不断进化,总有新特性等待开发者探索和学习。
2. ListFormatter 类的引入
最近引起我注意的一个特性是 ListFormatter
类。如果你曾经在 Swift 中处理过列表,并需要将它们连接成一个人类可读的句子,你可能使用过 joined
操作符和一些自定义逻辑来为最后一个项目提供不同的分隔符:
swift
复制
bash
let languages = ["Swift", "Kotlin", "Rust"]
let joinedLanguages = languages.dropLast().joined(separator: ", ")
+ (languages.count > 1 ? " and " : "")
+ (languages.last ?? "")
// 输出: "Swift, Kotlin and Rust"
虽然这种实现适用于特定用例,但它不能很好地扩展,因为它没有考虑用户的区域设置和语言。
3. ListFormatter 和 ListFormatStyle 的作用
ListFormatter
和 ListFormatStyle
是 Foundation 框架的一部分,提供了一种将项目列表连接成自然且本地化的人类可读句子的方法。
4. 使用 ListFormatter
你可以创建一个 ListFormatter
实例,然后调用 string(from:)
方法将任何项目列表转换为人类可读的句子:
swift
复制
csharp
import Foundation
let listFormatter = ListFormatter()
// 输出: "Swift, Kotlin, and Rust"
listFormatter.string(from: ["Swift", "Kotlin", "Rust"])
默认情况下,ListFormatter
类会考虑用户的区域设置。你也可以通过修改格式化器实例的 locale
属性来强制使用特定的区域设置:
swift
复制
csharp
import Foundation
let listFormatter = ListFormatter()
listFormatter.locale = Locale(identifier: "es-ES")
// 输出: "Swift, Kotlin y Rust"
listFormatter.string(from: ["Swift", "Kotlin", "Rust"])
5. 支持多种类型
虽然我只使用了字符串数组,但 ListFormatter
并不限制你只能使用字符串。实际上,API 设计为接受任何类型的数组:
swift
复制
swift
import CoreFoundation
@available(macOS 10.15, *)
open class ListFormatter : Formatter {
open func string(from items: [Any]) -> String?
}
需要注意的是,为了使 string
方法产生有意义的结果,项目必须能够表示为字符串。许多类型(如 Int
)已经可以表示为字符串,但对于自定义类型,你可能需要遵循 CustomStringConvertible
协议:
swift
复制
less
import Foundation
struct Language: CustomStringConvertible {
let title: String
var description: String {
return title
}
}
let listFormatter = ListFormatter()
// 输出: "Swift, Kotlin, and Rust"
listFormatter.string(from: [
Language(title: "Swift"),
Language(title: "Kotlin"),
Language(title: "Rust")
])
6. 使用 formatted 方法
虽然 ListFormatter
很好用,但我更喜欢在列表实例上使用 formatted
方法,因为它更简洁,并提供了进一步的定制选项:
swift
复制
css
import Foundation
let languages = ["Swift", "Kotlin", "Rust"]
// 输出: "Swift, Kotlin, and Rust"
languages.formatted()
// 输出: "Swift, Kotlin, or Rust"
languages.formatted(.list(type: .or))
// 输出: "Swift, Kotlin, & Rust"
languages.formatted(.list(type: .and, width: .short))
总结
- ListFormatter 是一个强大的工具,用于将列表转换为人类可读的句子,并支持本地化。
- 它不仅可以处理字符串数组,还可以处理任何可以表示为字符串的类型。
- 通过
formatted
方法,开发者可以更简洁地实现列表格式化,并进一步定制输出格式。
这篇文章展示了如何在 Swift 中利用 ListFormatter
和 formatted
方法来处理列表的本地化和格式化,使得代码更加简洁和可维护。