Swift 5.0 增强的字符串插值及格式化
字符串插值在Swift早期版本一直存在,但是Swift 5.0之后,这项功能被大规模的改造,更强大,更便捷。
基础用法
Objective-C是这样使用的:
[NSString stringWithFormat:@"%ld", (long)count]; |
Swift优雅的多了:
let age = 30 |
Swift 5.0的发布,带来了ABI稳定性,这是开发者最渴望看到的,比如原始支持Result
和isMultiple(of:)
,等等。
除此之外,一起看看Swift 5.0是如何格式化字符串的。
首先我们创建这样一个整数:
let age = 30 |
然后最简单的使用字符串插值的方法:
print("Hi, I'm \(age).") |
但是如何进行字符串格式呢?
在Swift 5.0中使用了新的字符串插值方案,我们可以通过扩展:String.StringInterpolation
添加自己的自定义插值显示方式,如下展示:
extension String.StringInterpolation { |
现在代码就会打印这样的结果:Hi,I'm thirty.
我们可以通过同样的技术来调节日期格式,默认的显示格式真心不是我们喜欢的。
print("Today is \(Date()).") |
你会看到Swift打印的格式长这个样子:2019-02-24 10:30:22 +0000
。是时候再自定义一下了。
mutating func appendInterpolation(_ value: Date) { |
这看起来好多了,结果会显示这样:February 24, 2019 10:30:22
.
带参显示
正如上述,appendInterpolation()
是不带参数的,下面继续扩展一下,学习更高级的一些用法。
比如,我们可以用代码包装一下twitter的显示方式:
mutating func appendInterpolation(twitter: String) { |
现在可以这样来打印了:
print("Please follow me on Twitter: \(twitter: "itreefly").") |
这才是一个参数,继续扩展更多的参数,比如两个参数的方法:
mutating func appendInterpolation(format value: Int, using style: NumberFormatter.Style) { |
然后这样来调用:
print("Hi, I'm \(format: age, using: .spellOut).") |
你可以随意使用任意的参数,作为示例,我更喜欢使用autoclosures
附带一个自定义的值,代码如下:
extension String.StringInterpolation { |
Erica Sadun提供了一个非常”short and sweet”的示例来精简代码:
extension String.StringInterpolation { |
自定义类型插值显示
针对类型struct定义插值显示,然后直接打印
struct Person { |
使用插值显示的JSON数据:
mutating func appendInterpolation<T: Encodable>(debug value: T) { |
如果类型Person
适配Encodable
,就可以这样打印数据:
print("Here's some josn data: \(debug: hater)") |
如何处理错误呢?添加方法后添加throws
,print
后面跟上try
即可。
mutating func appendInterpolation<T: Encodable>(debug value: T) throws { |
文章翻译整理来自原文:https://www.hackingwithswift.com/articles/178/super-powered-string-interpolation-in-swift-5-0
- 标题: Swift 5.0 增强的字符串插值及格式化
- 作者: tree_fly
- 创建于 : 2019-02-24 10:43:37
- 更新于 : 2019-02-26 10:43:37
- 链接: https://itreefly.com/posts/3bf40970.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。