2017-07-24 52 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