3

在 Swift 4.0 中,以下代码无法编译:

var str: String!
func someFunc(_ s: inout String?) {}
someFunc(&str)

现在我想这实际上str是一种类型String?,Swift 编译器似乎同意:

无法传递“字符串”类型的不可变值?作为 inout 参数

我可以通过将变量更改为类型String?或函数参数来解决此问题,(_ s: inout String!)但我不明白为什么必须这样做。Swift 似乎已经同意这var str : String!是“'String' 类型的?”——那为什么不让我在这里传递呢?

是否有另一个选项可以让我的变量隐式展开,但仍将其传递给修改可选的函数?

我试过someFunc(&(str?))了,这让事情变得更奇怪了——<strong>然后 Swift 抱怨道:

无法传递“字符串!”类型的不可变值 作为 inout 论点”。

所以str是 aString?但不能作为 a 传递String?str?而是 a String!?!

该代码实际上是:

var str: String!
func someFunc(_ x: inout String!) {}
someFunc(&(str?))

所以也许 Swift 在它的错误消息中错误地说明了参数的类型,而不是传递的值……或者什么?

4

1 回答 1

1

这是swift 编译器中的一个已知错误Hamish 在评论中说,这已在 Swift 4.1 快照中修复,因此它可能会在下一个 Xcode 版本(9.3)中修复。

您可以通过摆脱隐式展开的可选(IUO)来解决这个问题,无论如何都应该避免这种情况。根据为什么它目前是 IUO,要么:

var str: String?
func someFunc(_ x: inout String?) {}
someFunc(&str)

或者

var tmp: String?
func someFunc(_ x: inout String?) {}
someFunc(&tmp)
let str = tmp!

我强烈推荐第一个,除非绝对必要,否则避免强制展开。

于 2018-02-15T19:44:50.223 回答