工作为什么+=
不含蓄展开自选工作,例如:为什么`+ =`不含蓄展开自选
var count: Int! = 10
count = count + 10 // This works
count += 10 // this does not work
为什么不是可选的隐式展开,像count = count + 10
的情况下?
工作为什么+=
不含蓄展开自选工作,例如:为什么`+ =`不含蓄展开自选
var count: Int! = 10
count = count + 10 // This works
count += 10 // this does not work
为什么不是可选的隐式展开,像count = count + 10
的情况下?
它不起作用,因为复合赋值运算符+=
预计左侧是可变的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)值,但是这个值将是immutable_(当它被提供时,隐式地解包的可选值的包装值表示的属性implicitly_)。由于'+ ='方法(/运算符)的第一个参数(或左侧)是'inout'参数,因此您可能不会将不可变属性传递给它。 – dfri
(...当'lhs'是type('inout')'Int!'和'rhs'是'Int'类型时,上面定制的'+ ='运算符只是提供了一个更具体的重载。意味着在调用count + = 10'(以匹配重载'(+ =)(inout Int,Int)')中不需要隐式地展开'count',因为对于该调用存在完美的过载匹配。然而,重载的主体明确地解开包装的值,允许它的变化)。 – dfri
操作员需要参考。 – Sulthan
你能解释一下吗? –
函数“+ =”花费一个Int。你给它一个Int !. – scord