2014-09-25 70 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)。