swift SubClass和Casting

时间:2014-06-24 13:23:44

标签: casting swift subclass

这是我做的测试: 我定义了两个类:

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")
}

3 个答案:

答案 0 :(得分:3)

如果您不想/不能更改上下文的代码,可以向上投射,然后在一行上进行向下转换测试:

if x as Any is Test1 {
    println("ok")
}else{
    println("no")
}

答案 1 :(得分:2)

isasas?运算符仅用于“向下”。也就是说,如果您有一个类型为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,因此您可以测试它是否符合任何对象类型 这将打印确定