2016-09-21 60 views
1

我看到這個在審查雨燕2.2的代碼,我很不解:明確的解包分配的可選特性在雨燕2.2

(myVar?.aProperty=aValue)! 

其中安勤爲不可選。

這個表達式的結果不存儲在任何地方,因此爲什麼放一個!最後?另外,這種表達方式的術語是什麼?

+0

IMO,你是對的。表達結果不被使用。 –

回答

1

它在閉包中使用時有點不同。

let closure1 = { 
    aVar?.aProperty = aValue 
} 
let closure2 = { 
    (aVar?.aProperty = aValue)! 
} 

夫特推斷的closure1類型()->Optional<()>,又名()->Void?。這與()->Void不一樣。因此,closure1不能傳遞給聲稱爲()->Void的參數。

所以,如果你想關閉的類型()->Void,你可能需要編寫這樣的事:

let closure1 = { 
    _ = aVar?.aProperty = aValue 
} 

或者這樣:

let closure1 = { 
    aVar?.aProperty = aValue 
    return 
} 

要不然:

let closure1 = { 
    (aVar?.aProperty = aValue)! 
} 

現在,你可以寫這樣的東西:

let closure1:()->Void = { 
    aVar?.aProperty = aValue 
} 

但是,在舊的Swift中,最後一個例子沒有編譯。


如果您在完全不同的上下文中發現該代碼而不是閉包,我無法猜測目的是什麼。

+0

很好的解釋。然而,代碼被嵌入到不返回任何值的func中。 – andrewz