这是在此拉取请求中进行的更改,原因是这样的事实,即插值Optional(...)
到结果字符串中通常是不希望的,在具有隐式展开的optionals的情况下,这尤其令人惊讶。您可以在此处的邮件列表中看到有关此更改的完整讨论。
正如拉取请求讨论中提到的(尽管不幸的是,不是Xcode提出的)–使警告静音的一种比使用更好的方法String(describing:)
是将强制类型转换添加到要插值的可选类型中,例如:
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i as Int?)")
print("description of d: \(d as Double?)")
也可以概括为as Optional
:
print("description of i: \(i as Optional)")
print("description of d: \(d as Optional)")
在Swift 5中,SE-0228引入了新的字符串插值系统,另一个选择是为以下项添加自定义appendInterpolation
重载DefaultStringInterpolation
:
extension DefaultStringInterpolation {
mutating func appendInterpolation<T>(optional: T?) {
appendInterpolation(String(describing: optional))
}
}
var i: Int? = 5
var d: Double? = nil
print("description of i: \(optional: i)")
print("description of d: \(optional: d)")
而且,如果需要,您甚至可以删除参数标签以完全在模块内(或在标记为的情况下在特定文件内)禁用警告fileprivate
:
extension DefaultStringInterpolation {
mutating func appendInterpolation<T>(_ optional: T?) {
appendInterpolation(String(describing: optional))
}
}
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i)")
print("description of d: \(d)")
虽然我个人更希望保留论点标签。