2014-09-25 56 views
1

根據Apple's doc,檢查類型運算符爲「is」。Swift運算符「是」

我正在嘗試波紋管。

class BaseClass { 
} 

class SomeClass : BaseClass { 
} 

class OtherClass : BaseClass { 
} 

var s_ : SomeClass = SomeClass() 

if(s_ is SomeClass) { 
} 


if(s_ is OtherClass) { 
} 

編譯器說'is' test is always true第一個if語句,和'OtherClass' is not a subtype of 'SomeClass'

爲什麼我不能編譯這個?

ADDED

這是使用is

var arr_ : [AnyObject] = Array<AnyObject>() 
arr_.append(BaseClass()) 
arr_.append(SomeClass()) 
arr_.append(OtherClass()) 

for object in arr_ { 
    if(object is SomeClass) 
    { 
     println("\(object) is SomeClass") 
    } 
    else 
    { 
     println("\(object) is not SomeClass") 
    } 
} 
+0

這段代碼有什麼錯誤? – 2014-09-25 06:02:25

回答

2

這兩個說法是正確的和有意義的,因爲s_,所申報的,必須的對象的正確方法SomeClass的。

因此,_s is SomeClass總是如此,因爲它必須是SomeClass的一個對象。並且,_s is OtherClass始終爲false,因爲OtherClass是而不是 SomeClass的子類型如上所述。由於這些是可證明的錯誤,所以編譯器禁止這樣的使用。

現在,將代碼更改爲var s_ : BaseClass = SomeClass()並注意不同的結果。

隨着這一變化的s_值可能是SomeClass的實例(至於編譯器和類型系統知道),但它可能是符合BaseClass的,包括SomeClass的任何對象其他類是子類型。

0

你所看到的是非常有意義的。這是類似於,使用簡單的替換:

define shape 
define square as subclass of shape 
define circle as subclass of shape 

s = square() 
print (s is square) # yes, obviously. 
print (s is circle) # no, not a chance. 

也許你意味着最後一個是s is shape(或者,你的情況,s_ is BaseClass)。