根据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")
}
}
答案 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
)。