蘋果文檔中提到:斯威夫特零是不一樣的Objective-C的零
斯威夫特的零是不一樣的在Objective-C爲零。在Objective-C中,無 是一個指向不存在的對象的指針。在Swift中,零不是 指針 - 它是缺少某種類型的值。 可選任意類型可設置爲零,不只是對象類型
什麼時候上述知識有用? 編譯器會在適用的情況下自動將Swift nil轉換爲Objective-C nil,反之亦然?
蘋果文檔中提到:斯威夫特零是不一樣的Objective-C的零
斯威夫特的零是不一樣的在Objective-C爲零。在Objective-C中,無 是一個指向不存在的對象的指針。在Swift中,零不是 指針 - 它是缺少某種類型的值。 可選任意類型可設置爲零,不只是對象類型
什麼時候上述知識有用? 編譯器會在適用的情況下自動將Swift nil轉換爲Objective-C nil,反之亦然?
是的,編譯器會將Objective-C的nils轉換成Swift的nils。這就是爲什麼當從Objective-C轉換時,所有的指針都必須成爲Swift中的可選項。
這方面的知識的usefullenss就在你給的描述:
任何類型的選配可設爲零,而不僅僅是對象迅速各類可製成各類
可選,因此nil
。例如,在Objective-C中,你不能使NSInteger爲零。
技術上nil
只是在可選枚舉的情況下:
enum Optional<T> {
case None
case Some(T)
}
nil
只是爲None
情況
首先手短,這意味着,只有自選可以有一個零值,例如:
// Objc:
Object *foo = nil;
foo = [Object new];
foo = nil;
// Swift
var foo: Object = nil // not allowed
var bar: Object = Object()
bar = nil // not allowed
var foo: Object? = nil // fine
foo = Object()
foo = nil
但更重要的應用程序是在原始類型。如果你在objc中有一個int,並且它可能有一個無效值,你需要決定這個無效值,並確保調用者和被調用者知道它。
// Objc
int i = 0; // Is this valid?
i = -1 // What about this?
// Swift
var bar: int? = nil // Invalid.
bar = 0 // valid.
bar = -1 // valid.
上述知識總是有用的。 – matt
@matt,我並不是說它沒有用處 - 我在問什麼時候應該注意這些知識,或者在編碼時記住它是有用的。 – Boon
好的,那麼:每次在Swift中使用「nil」這個詞時,每次測試nil時,以及每次在Swift和Objective-C之間發送或接收一個值時,它都會很有用。 – matt