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

隐式展开的可选项真的是可选项吗?

微生令雪
2023-03-14

在Swift 4.0中,以下代码不可编译:

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

现在我想象strString类型的

无法将类型“String?”的不可变值作为inout参数传递

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

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

我试过 someFunc(

无法传递“String!”类型的不可变值正如我所说的那样。

所以 str是一个 String?但不能作为 String?传递,而 str?是一个 String!?!

这段代码实际上是:


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

   

所以,也许斯威夫特在错误消息中错误地说出了参数的类型,而不是传递的值……或者其他什么?


共有1个答案

喻元龙
2023-03-14

这是swift编译器中的一个已知错误。哈米什在评论中说,这在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!

我强烈建议首先,除非绝对必要,否则不要强行展开。

 类似资料:
  • 如果像Apple在Swift编程中所说的隐式展开选项应该总是有一个值,那么为什么不使用非选项来代替呢?我知道非选项不能赋值为nil,但还有其他区别吗?

  • 问题内容: 为什么无法对隐式解包的可选变量进行突变? 这是一个重现问题的简短示例: 带整数 问题答案: 更新: Xcode Beta 5中的一个小警告已解决此问题: 该数组可以按预期工作,但是现在看来整数仍然需要显式拆包以允许使用 当前,这仅仅是Optionals的本质(无论是否隐式解包)。unwrap运算符返回一个不变的值。这可能是固定的,或者将来会提供更好的解决方案。 目前唯一的解决方法是将数

  • 我正在学习Swift,我对隐式展开选项有疑问。 我有一个返回字符串可选的函数: 以及执行安全展开的if语句,它使用隐式展开可选作为其常量: 在第一行中,apt按照应有的方式展开(结果窗格显示“404”),但在其他两行中,apt没有展开:结果窗格和控制台都显示打印的值是可选的(“404”)和找到的公寓:可选(“404”),为了让404出现在控制台上,我必须使用!符号,如果我理解正确,它只需要手动展开

  • 一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会: 没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开()操作,普通选项需要

  • 在编写一个新的swift类时,当(不)使用隐式展开选项而不仅仅是普通选项时,我仍然不是100%舒服。据我所知,如果你从来没有期望它的值为零,那么把它指定为隐式未包装(可选)应该是可以的。如果为nil,则为异常事件,应导致运行时错误。 例如,这个简单的登录视图包含两个text field成员变量: 在上面的类中,emailField和passField都被归类为隐式展开选项,因为我从来没有期望它们在

  • 问题内容: 在Xcode 8发行版中,我发现了一个奇怪的场景。 这是代码, 结果如下: 上面的这些表明,当我为没有显式类型的变量分配一个 隐式解包的optional时 ,该类型将被推断为一个可选类型,而不是它最初的类型,也就是 隐式解开的optional 。 我的Xcode已更新至8。任何人都可以验证Xcode 7.x中的行为吗? 更改是由于Swift版本更改还是Xcode? 问题答案: 这是SE