自 beta 8.3 以来,无数警告“字符串插值生成可选值的调试描述;您是要明确说明吗?”出现在我的代码中。
例如,在以下情况弹出警告,其中 options 可能导致 nil:
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
按照之前的设计,我(和编译器)可以将可选值插入为“nil”。但是编译器改变了主意。
编译器建议添加一个String构造函数,描述如下:
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
显然,结果是明确的,但在我看来也非常繁琐。有更好的选择吗?我是必须修复所有这些警告还是最好等待下一个测试版?
最佳答案
这是在 this pull request 中所做的更改因为将 Optional(...) 插入到结果字符串中通常是不可取的,而且可能特别令人惊讶 in cases with implicitly unwrapped optionals .您可以在邮件列表中查看此更改的完整讨论 here .
正如在 pull request discussion 中提到的(虽然不幸的是不是 Xcode 提到的)——一个比使用 String(describing:) 稍微好一点的警告静音方法是添加一个强制转换到可选的无论你插值的类型,例如:
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i as Int?)") // description of i: Optional(5)
print("description of d: \(d as Double?)") // description of d: nil
也可以概括为as Optional:
print("description of i: \(i as Optional)") // description of i: Optional(5)
print("description of d: \(d as Optional)") // description of d: nil
在 Swift 5 中,SE-0228 引入了新的字符串插值系统,另一种选择是为 DefaultStringInterpolation 添加自定义 appendInterpolation 重载:
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)") // description of i: Optional(5)
print("description of d: \(optional: d)") // description of d: nil
而且,如果需要,您甚至可以删除参数标签以在模块内完全禁用警告(或者在特定文件内,如果您将其标记为 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)") // description of i: Optional(5)
print("description of d: \(d)") // description of d: nil
虽然我个人更愿意保留参数标签。
关于swift - 如何解决Xcode 8.3 beta中的 "String interpolation produces a debug description for an optional value; did you mean to make this explicit?"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42543007/