当前位置: 首页 > 知识库问答 >
问题:

如何解决“字符串插值产生一个可选值的调试描述;你是故意把这个说得很明白吗?”在Xcode 8.3 beta中?

罗俭
2023-03-14

从beta 8.3开始,zillions warnings”字符串插值为可选值生成调试描述;你是故意把这个说得很明白吗?”出现在我的代码中。

例如,在以下情况下会弹出警告,其中选项可能导致为零:

let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"

按照之前的设计,对我(和编译器)来说,将选项插值为‘nil’是可以的。但是编译器改变了主意。

编译器建议添加一个String构造函数,描述如下:

let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"

显然,结果是显而易见的,但在我看来也非常非常繁琐。有更好的选择吗?我是必须修复所有这些警告,还是最好等到下一个测试版?

共有3个答案

高琛
2023-03-14

似乎使用String(描述:可选)是最简单的。

默认值??对于非字符串(如Int)没有意义。< br >如果Int为nil,则您希望日志显示“nil ”,而不是默认为另一个Int,例如0。

一些要测试的游乐场代码:

var optionalString : String? = nil
var optionalInt : Int? = nil

var description_ = ""
description_ = description_ + "optionalString: \(String(describing: optionalString))\r"
description_ = description_ + "   optionalInt: \(String(describing: optionalInt))\r"

print(description_)

输出

optionalString: nil
optionalInt: nil
羿昊英
2023-03-14

处理这个问题的两种更简单的方法。

备选案文1:

第一种方法是使用“砰”(!)将要返回的值“强制展开”

var someValue: Int? = 5
print(someValue!)

输出:

5

选项 2:

另一种方法,可能是更好的方法 - 是“安全地解开”要返回的值。

var someValue: Int? = 5

if let newValue = someValue {
    print(newValue)
}

输出:

5

我建议采用选项2。

提示:尽可能避免强制展开(!),因为我们不确定是否总是有要展开的值。

卫梓
2023-03-14

这是在此拉取请求中所做的更改,因为将 Optional(...) 插入到结果字符串中通常是不希望的,并且在隐式解包的可选选项的情况下尤其令人惊讶。您可以在邮件列表上看到有关此更改的完整讨论 请点击此处。.

正如在pull request讨论中提到的(尽管不幸的是不是通过Xcode)——一个比使用< code > String(descripting:)稍微好一点的方法是将一个强制转换添加到您正在内插的可选类型中,例如:

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

这也可以概括为< code >可选:

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 添加自定义 append 插值重载:

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

虽然就我个人而言,我更喜欢保留论点标签。

 类似资料:
  • 问题内容: 我有一个发誓的同事 在整个项目中可用的常量类中。这样,我们可以写类似 代替 我说是 不值得-它不会在堆/堆栈/字符串池中节省任何空间, 丑陋 滥用常量类。 谁是白痴? 问题答案: 默认情况下,字符串文字是Interned的,因此无论您在代码中多次引用 “” ,都将只有一个空的String对象。声明EMPTY_STRING没有任何好处。否则,您最好为整数文字声明一个,两个,三个,四个等。

  • 一开始我得到了一些ClassCastExceptions。当我找到源代码时,我发现我的中的值实际上是字符串。 我做了以下实验来检查PrimeFaces的使用是否是我的问题: 我的TestBean: 那么我的问题是:我怎样才能轻松地围绕它工作呢? 我对JSF很陌生,在寻找解决方案时我听说过转换器。是否必须创建自定义转换器来强制对输入字段的进行调用?我在哪能找到怎么做?有没有更简单的解决办法?

  • 编写一个程序,定义一个类TestIsSubString和一个方法isSubString,该方法在另一个字符串中搜索特定的字符串;如果前者存在于后面的字符串中,则该方法必须返回true。例如:-isSubString(“cat”,“the cat in the hat.”)为true,但isSubString(“bat”,“the cat in the hat.”)为false。还要验证满足以下边界

  • 例如: 字符串1=helloworld字符串2=asdfuvjerhelloworld 这应该是真的。 另一个例子:字符串1=helloworld字符串2=lshewodxzr 这也应该是真的。 所以我正在研究如何创建一个方法,它将返回一个布尔值,检查第二个字符串是否包含第一个字符串中的字母。在第二个示例中,string2只有一次字母l,尽管字母l在string1中出现了三次,但仍然返回true。

  • 我有以下字符串: 我需要一个正则表达式来删除数字之间的空白,但也要避免在数字之前有一个非数字值,如 这里想要避免任何非数值后面的数值,这里在我的字符串中想要避免数值也在H后面,这里有2,但我只想做一个像“23445 2546”这样的字符串。如果有任何字母字符在那里,它应该被删除,并添加空格之间的数字。 从上面的正则表达式和代码,我得到了输出: 所需输出:

  • 问题内容: 目的: 在Golang中的字符串中每x个字符插入一个字符 输入: 预期产量: 尝试次数 尝试一次 结果是: 尝试两次 计算字符数 对于循环 如果X = 5,则插入一个 尝试三 扫描结合加入 问题 目前尝试两次和三次不包含代码段的原因是,我仍在思考应该使用哪种方法在Golang中的字符串中每X个字符插入一个字符。 问题答案: https://play.golang.org/p/HEGbe