这是我做的测试: 我定义了两个类:
class Test1 {
var p1:String? = "p1"
init(){
println("init test1")
}
}
class Test2: Test1 {
init() {
super.init()
p1 = "p2"
println("init test2")
}
}
然后我创建了一个Test2实例
let x = Test2()
我想检查Test2是否是Test2的子类
if x is Test1 {
println("ok")
}else{
println("no")
}
但是我有一个构建错误: Test1不是Test2的子类型
我哪里错了?
我试过,但没有成功,也是这样:
if let y = x as? Test1 {
println("ok")
}else{
println("no")
}
答案 0 :(得分:3)
如果您不想/不能更改上下文的代码,可以向上投射,然后在一行上进行向下转换测试:
if x as Any is Test1 {
println("ok")
}else{
println("no")
}
答案 1 :(得分:2)
is
,as
和as?
运算符仅用于“向下”。也就是说,如果您有一个类型为Test1
的实例,则可以检查是否可以使用Test2
将其向下转换为is
。
如果要检查Test2
的实例是否是您使用isKindOfClass()
的任何特定类的子类。但是,这仅适用于NSObject
类层次结构中的类。
let x = Test2()
if x.isKindOfClass(Test1) {
println("ok")
} else {
println("no")
}
答案 2 :(得分:0)
正如Cezar所解释的那样,只能“向下”工作 但是,您可以像这样重写您的语句:
var x: AnyObject = Test2()
if x is Test1 {
println("ok")
}else{
println("no")
}
将x声明为Anyobject,因此您可以测试它是否符合任何对象类型 这将打印确定