func myFunction() -> NSData { ... }
意味着myFunction
返回NSData
一個實例。上述
func myFunction() -> NSData? { ... }
意味着myFunction
返回Optional<NSData>
型(也稱爲NSData?
)的值。 Optional
是enum
,有兩種情況:.some(value)
和.none
(也稱爲nil
)。因此該函數返回NSData
(包裝在.some
的情況下)或nil
。上述
func myFunction() -> NSData! { ... }
意味着myFunction
返回Optional<NSData>
類型,就像在前面的例子中NSData?
返回類型的值。
但是,使用!
意味着,如果您使用myFunction()
的值的方式不進行類型檢查,編譯器會嘗試爲您打開返回的值。所以,如果你這樣說:
let maybeLength = myFunction()?.length
那麼編譯器會看到,你是治療的myFunction
返回值作爲Optional<NSData>
。但是,如果你這樣說:
let dataLength = myFunction().length
那麼編譯器會看到Optional<NSData>
沒有length
成員,因此它會假裝你寫了這個:
let dataLength = myFunction()!.length
,如果可以編譯,它會繼續。
此行爲在Swift Evolution proposal SE-0054, Abolish ImplicitlyUnwrappedOptional
type中定義。
現在我們終於可以這樣考慮:
func myFunction() -> NSData! { ... }
let data = myFunction()
data?.write()
什麼是data
類型?編譯器必須根據=
右側的表達式推斷出data
的類型。正如我在上面的例子中解釋的那樣,myFunction()
的類型是Optional<NSData>
。所以data
的類型是Optional<NSData>
,也叫NSData?
。
編譯器沒有遇到任何問題,使得data
的類型爲NSData?
,所以它沒有理由隱式地解開返回值myFunction
。
可能是重複https://stackoverflow.com/questions/24061039/how-is-a-return-value-of-anyobject-different-from-anyobject – rmaddy
對於'NSData',這兩者之間沒有什麼不同兩行代碼。你可以在@rmaddy發送的鏈接中找到Rob的一個很好的解釋。 – Lawliet
在實踐中**從不**使用隱式展開的可選值作爲函數/方法中的返回類型。這個值可以是'nil',然後使用'?'或者該值永遠不會'nil',然後使用'non-optional'。 – vadian