如何解决“字符串插值为一个可选值生成调试描述;您是要明确显示它?” 在Xcode 8.3 beta中?

斯特凡·德·卢卡

从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)"

显然,结果在我看来是明确的,但也非常麻烦。有更好的选择吗?我是否必须解决所有这些警告,或者更好地等待下一个Beta?

截图说明

哈米什

这是在此拉取请求中进行的更改,原因是以下事实:Optional(...)通常不希望插值到结果字符串中,而在具有隐式展开的optionals的情况下,这尤其令人惊讶您可以在此处的邮件列表中看到有关此更改的完整讨论

正如拉取请求讨论中提到的(尽管不幸的是,不是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引入了新的字符串插值系统,另一个选择是为以下项添加自定义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)") // 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

虽然我个人更希望保留论点标签。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档