2016-02-29 87 views
2

我知道在Swift中,===運算符就像Objective-C中的==,當比較兩個類時,如果兩個變量指向同一個堆地址如何理解「===(identity)」用於比較Swift中的兩種類型

,但我會遇到使用情況===一個比較兩個類型

func typeTester(d:Dog, _ whattype:Dog.Type) { 
    // if d.dynamicType is whattype { // compile error, "not a type" (i.e. a not a type literal) 
    if d.dynamicType === whattype { 
     print("yep") 
    } else { 
     print("nope") 
    } 
} 

,我真的不明白,所以,一型還有內存地址?

回答

1

1)whattype是存儲類型信息的變量。

2)is操作者必須遵循某些類型不變量,其存儲關於某種類型

使用類型檢查操作者is信息來檢查一個實例是否爲 某些亞類的類型。如果 實例屬於該子類,則類型檢查運算符返回true,如果不是,則返回false。

3)identity運營商使用

檢查兩個常量或變量是否指的是同一個 例如

這意味着你正在試圖混合不同類型的檢查方法:

// incorrect 
d.dynamicType is whattype 
d.dynamicType == Dog 
d.dynamicType === Dog 
d == whattype 

// technically correct, but logically not and will always return false 
d.dynamicType is Dog // Xcode will show warning 
d === whattype 

// correct 
d is Dog 
d.dynamicType == whattype 
d.dynamicType === whattype 
0

Swift有兩種類型的值 - 值類型(通過值傳遞,使用副本 - 結構,枚舉)和引用類型(通過引用 - 類傳遞)。

什麼是參考?一個引用是一個內存地址。這就是===正在比較的。它比較兩個對象引用是否指向同一個對象。

有一些類有單例實例。這意味着比較實例引用是安全的並且表示相等。類型參考是使用===(身份)進行比較是安全的情況之一。運行時有一個內部類型引用池,並且它始終爲相同類型返回相同的實例。