返回

使用 Swift 5 字符串插值快速构建 AttributeString

IOS

引言

一直以来,在 Cocoa 体系里构建富文本是一件很繁琐的事情,使用 Foundation 框架里的 NSAttributeString 来进行构建,有着要区分可变与不可变,传入需要查阅文档的参数字典,没有类型检查等种种别扭之处。Swift 5 出现的新字符串插值特性,让处理自定制的 attributed string 变得异常的方便。

快速上手

Swift 5 里提供了 AttributedString 的自定制插值,我们只需要在字符串前后加上两个反引号 ````,就能轻松快速的构建 attributed string。语法如下:

let attrString = """
    Hello,
    \(NSAttributedStringKey.foregroundColor.rawValue): red,
    \(NSAttributedStringKey.font.rawValue): Helvetica, size 12
    """

在上面的代码中,我们通过字符串插值的方式,为一段字符串指定了前景颜色为红色,字体为 Helvetica,字号为 12 的样式。

提示: 这里我们使用了 NSAttributedStringKey.foregroundColor.rawValue 和 NSAttributedStringKey.font.rawValue 是因为 Swift 5 中枚举的原始值现在是公开的,我们可以直接使用它们来访问属性键。

高级用法

除了设置简单的文本样式,我们还可以通过字符串插值来插入图像、链接,甚至是其他 AttributedString。例如:

let attributedString = """
Hello,

\(NSAttributedStringKey.foregroundColor.rawValue): red,
\(NSAttributedStringKey.font.rawValue): Helvetica, size 12

[Image: MyImage.png]

\(NSAttributedStringKey.link.rawValue): https://example.com

\(NSAttributedString(string: "Nested attributed string"))
"""

提示: 对于图像,我们使用 [Image: imageName] 的语法。对于链接,我们使用 [Link: url] 的语法。

与 NSAttributedStringKey 兼容

字符串插值构建的 AttributedString 与 NSAttributedStringKey 完全兼容。我们可以使用 NSAttributedStringKey 里的常量来访问属性键,并使用 setAttributes(_:range:) 方法来修改属性。例如:

// 创建一个 attributed string
let attributedString = """
    Hello,
    \(NSAttributedStringKey.foregroundColor.rawValue): red,
    \(NSAttributedStringKey.font.rawValue): Helvetica, size 12
    """

// 修改 attributed string 的前景颜色
attributedString.setAttributes([.foregroundColor: UIColor.blue], range: NSRange(location: 0, length: 5))

结语

Swift 5 的字符串插值特性为构建自定制的 attributed string 提供了一种简单、方便、强大的方式。通过使用这种特性,我们可以轻松快速地创建出具有复杂样式的文本。