2014-06-23 19 views
-2

蘋果文檔中提到:斯威夫特零是不一樣的Objective-C的零

斯威夫特的零是不一樣的在Objective-C爲零。在Objective-C中,無 是一個指向不存在的對象的指針。在Swift中,零不是 指針 - 它是缺少某種類型的值。 可選任意類型可設置爲零,不只是對象類型

什麼時候上述知識有用? 編譯器會在適用的情況下自動將Swift nil轉換爲Objective-C nil,反之亦然?

+5

上述知識總是有用的。 – matt

+0

@matt,我並不是說它沒有用處 - 我在問什麼時候應該注意這些知識,或者在編碼時記住它是有用的。 – Boon

+2

好的,那麼:每次在Swift中使用「nil」這個詞時,每次測試nil時,以及每次在Swift和Objective-C之間發送或接收一個值時,它都會很有用。 – matt

回答

7

是的,編譯器會將Objective-C的nils轉換成Swift的nils。這就是爲什麼當從Objective-C轉換時,所有的指針都必須成爲Swift中的可選項。

這方面的知識的usefullenss就在你給的描述:

任何類型的選配可設爲零,而不僅僅是對象迅速各類可製成各類

可選,因此nil。例如,在Objective-C中,你不能使NSInteger爲零。

技術上nil只是在可選枚舉的情況下:

enum Optional<T> { 
    case None 
    case Some(T) 
} 

nil只是爲None情況

+0

我喜歡最後一個註釋,即nil只是None的簡寫。有沒有辦法通過代碼證明這一點? – Boon

+0

正如他向你展示的那樣,它在標題中。你還想要什麼?每個可選實際上是一個由None(無)或一個值組成的枚舉(一些「包裝」實際值)。這就是Swift中的零。 – matt

+2

我一直在找這樣的東西:Optional.None === nil。我證實了,事實確實如此。謝謝。 – Boon

2

首先手短,這意味着,只有自選可以有一個零值,例如:

// 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.