Swift算子"是"

时间:2014-09-25 05:53:28

标签: swift

根据Apple's doc,检查类型操作符是“是”。

我在尝试风箱。

class BaseClass {
}

class SomeClass : BaseClass {
}

class OtherClass : BaseClass {
}

var s_ : SomeClass = SomeClass()

if(s_ is SomeClass) {
}


if(s_ is OtherClass) {
}

编译器对第一个if语句和'is' test is always true'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")
    }
}

2 个答案:

答案 0 :(得分:2)

这两个陈述都是正确的并且有意义,因为s_,如声明的那样,必须是SomeClass的对象。

因此,_s is SomeClass始终为真,因为必须是SomeClass的对象。并且,_s is OtherClass始终为false,因为OtherClass 不是所声明的SomeClass的子类型。由于这些是可证明的错误,编译器禁止这样使用。

现在,将代码更改为var s_ : BaseClass = SomeClass(),并注明不同的结果。

通过此更改,s_的值可能是SomeClass的实例(就编译器和类型系统而言),但它可能是任何对象符合BaseClass ,包括子类型SomeClass和OtherClass。

答案 1 :(得分: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)。