2017-07-24 56 views
5

工作为什么+=不含蓄展开自选工作,例如:为什么`+ =`不含蓄展开自选

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

为什么不是可选的隐式展开,像count = count + 10的情况下?

+1

操作员需要参考。 – Sulthan

+0

你能解释一下吗? –

+0

函数“+ =”花费一个Int。你给它一个Int !. – scord

回答

2

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

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

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

现在+=向左侧是一个隐含展开可选没有展开它,解缠在函数内部显式执行。

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

那么为什么count + 10正在工作? –

+0

这个答案不正确。在'count + = 10'表达式中,'count'会隐式地展开为一个具体的(Int)值,但是这个值将是immutable_(当它被提供时,隐式地解包的可选值的包装值表示的属性implicitly_)。由于'+ ='方法(/运算符)的第一个参数(或左侧)是'inout'参数,因此您可能不会将不可变属性传递给它。 – dfri

+0

(...当'lhs'是type('inout')'Int!'和'rhs'是'Int'类型时,上面定制的'+ ='运算符只是提供了一个更具体的重载。意味着在调用count + = 10'(以匹配重载'(+ =)(inout Int,Int)')中不需要隐式地展开'count',因为对于该调用存在完美的过载匹配。然而,重载的主体明确地解开包装的值,允许它的变化)。 – dfri