在 Swift 4.0 中,以下代码无法编译:
var str: String!
func someFunc(_ s: inout String?) {}
someFunc(&str)
现在我想象str
属于类型String?
事实上,Swift 编译器似乎也同意:
无法传递“String”类型的不可变值?作为 inout 参数
我可以通过将变量更改为类型来解决此问题String?
或函数参数(_ s: inout String!)
但我不明白为什么我必须这样做。斯威夫特似乎已经同意这一点var str : String!
是“‘String 类型?’”——那么为什么它不让我把它传递到这里呢?
是否还有另一个选项可以用来隐式展开我的变量,但仍将其传递给修改可选值的函数?
I tried someFunc(&(str?))
and that just makes things weirder — then Swift complains:
无法传递“String!”类型的不可变值作为 inout 参数”。
So str
is a String?
但不能作为String?
, while str?
is a String!
?!
这是一个swift 编译器中的已知错误 https://bugs.swift.org/browse/SR-3512. 哈米什在评论中说 https://stackoverflow.com/questions/48814508/are-implicitly-unwrapped-optionals-truly-optionals#comment84633455_48814508这在 Swift 4.1 快照中已修复,因此可能会在下一个 Xcode 版本 (9.3) 中修复。
您可以通过摆脱隐式解包可选 (IUO) 来解决此问题,无论如何都应该避免这种情况。根据当前为 IUO 的原因,可以是:
var str: String?
func someFunc(_ x: inout String?) {}
someFunc(&str)
or
var tmp: String?
func someFunc(_ x: inout String?) {}
someFunc(&tmp)
let str = tmp!
我强烈建议第一点,除非绝对必要,否则避免强行展开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)