【问题标题】:Why does `+=` not work with implicitly unwrapped optionals [duplicate]为什么`+=`不适用于隐式展开的选项[重复]
【发布时间】:2017-07-24 20:23:11
【问题描述】:

为什么+= 不适用于隐式展开的选项,例如:

var count: Int! = 10
count = count + 10 // This works
count += 10 // this does not work

为什么没有像count = count + 10 那样隐式解包可选?

【问题讨论】:

  • 运营商需要参考。
  • 你能解释一下吗?
  • 函数 "+=" 消耗一个 Int。你给它一个 Int!。
  • 您可以将? 附加到+= 运算符count? += 10 的左侧,如果count 是“常规”可选Int?,这同样适用。如果它的值为nil,则+= 运算符将什么也不做,而如果它不是nil,它将在.some(value) 上进行工作,以增加右侧的value
  • 如果是这种情况,为什么这里 count = count + 10 (Int! + 10 ) 有效?

标签: swift optional forced-unwrapping


【解决方案1】:

它不起作用,因为复合赋值运算符 += 期望左侧是可变的 Int 变量。当你传递count 时,编译器会解开隐式解包的可选值,并发送一个不可变的Int 值,它不能作为inout 参数传递+= 所期望的。

如果你真的想这样做,你可以重载+=

func += (left: inout Int!, right: Int) {
    left = left! + right
}

现在+= 将左侧作为隐式解包的可选项发送而不解包,并且解包是在函数内部显式完成的。

var count: Int! = 10
count = count + 10 // 20
count += 10 // 30

【讨论】:

  • 那么为什么 count + 10 有效?
  • 这个答案不正确。在表达式count += 10 中,count 将隐式展开为具体的 (Int) 值,但该值 将是不可变的(隐式展开的可选值的封装值表示的属性当它被隐式提供时)。由于+= 方法(/operator) 的第一个参数(或左侧)是inout 参数,因此您自然不能将不可变属性传递给它。
  • (... 上面的自定义 += 运算符只是为lhs 类型为 (inout) Int!rhs 类型的情况提供了更具体的重载Int。这意味着不需要在调用count += 10 中隐式解包count(以匹配重载(+=)(inout Int, Int)),因为该调用具有完美的重载匹配。重载的主体,但是,显式解包包装的值,允许对其进行突变)。
  • @dfri 我没有意识到它实际上是在展开可选的;从错误消息中我认为它甚至没有尝试过。我编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
相关资源
最近更新 更多