工作爲什麼+=
不含蓄展開自選工作,例如:爲什麼`+ =`不含蓄展開自選
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