自从beta 8.3以来,数百万条警告“字符串插值产生一个可选值的调试描述;你是否意味着使这个显式?出现在我的代码中。
例如,警告弹出以下情况,选项可能导致零:
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
如以前设计的那样,对于我(和编译器),可选项被内插为“nil”。但是编译器改变了主意。
编译器建议添加一个带有描述的String构造函数,如下所示:
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
显然,结果是明确的,但在我看来也非常麻烦。有更好的选择吗?我必须修复所有这些警告,或者更好地等待下一个测试版?
这是07-07中发生的一个变化,因为将可选(…)内插到合成字符串中的情况通常是不希望的,并且可能特别令人惊讶
in cases with implicitly unwrapped optionals.您可以在邮件列表
here上查看对此更改的全面讨论。
如在拉请求讨论中所提到的(尽管不幸的是不是通过Xcode) – 一个比使用String(描述:)更安静一点的方法是将一个转换添加到可插入的任何内容中,因此,例:
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
哪个也可以推广为可选:
print("description of i: \(i as Optional)") // description of i: Optional(5) print("description of d: \(d as Optional)") // description of d: nil
另一种可能的方法是静默警告是访问可选的debugDescription:
print("description of i: \(i.debugDescription)") // description of i: Optional(5) print("description of d: \(d.debugDescription)") // description of d: nil
虽然值得注意的是,CustomDebugStringConvertible
的文档不鼓励直接访问debugDescription。