ByAI:Swift中ListFormatter的使用指南

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 的作用

ListFormatterListFormatStyle 是 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 中利用 ListFormatterformatted 方法来处理列表的本地化和格式化,使得代码更加简洁和可维护。

原文链接

www.polpiella.dev/join-list-o...

相关推荐
碎_浪1 天前
Mac 壁纸被 MDM 锁住?我做了个 2MB 的开源方案
macos·开源·swift
小牛不牛的程序员2 天前
开源一个 macOS 剪贴板「意图识别」工具——不只是存储,更是理解你复制了什么
macos·swift
apihz3 天前
经纬度制作高清卫星图片免费 API 接口详解
开发语言·ios·swift
00后程序员张4 天前
iOS 打包方式汇总 从 Xcode Archive 到轻量级工具链的 IPA 构建
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
sweet丶5 天前
Swift 黑魔法:`@dynamicMemberLookup`
swift·rxswift
大熊猫侯佩5 天前
SwiftUI 侦探笔记:iPhone 14 失踪的“刘海”与侯佩的像素诡计
swiftui·swift·apple
大熊猫侯佩5 天前
WWDC26 新 @ContentBuilder 修饰符:SwiftUI 终于有了户口本
swiftui·swift·wwdc
东坡肘子5 天前
当 Linux 成为“空气”:容器、Agent 与不再重要的“桌面之争” -- 肘子的 Swift 周报 #143
人工智能·swiftui·swift
wabil7 天前
【LVGL】滑动切换页面的界面优化实践
开发语言·ios·swift
东坡肘子12 天前
SPI 加入 Apple,Swift 迈向自举 -- 肘子的 Swift 周报 #142
人工智能·swiftui·swift