【问题标题】:swift SubClass and Casting快速子类和铸造
【发布时间】:2014-06-24 13:23:44
【问题描述】:

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

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

【问题讨论】:

  • 我找到了一种方法来处理这个问题让 x:AnyObject = Test2() 那么演员们有没有人更深入地解释原因?

标签: casting swift subclass


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    isasas? 运算符仅用于“向下”。也就是说,如果您有一个类型为Test1 的实例,您可以检查是否可以使用is 将其向下转换为Test2

    如果您想检查Test2 的实例是否是您使用isKindOfClass() 的任何特定类的子类。但是,这仅适用于 NSObject 的类层次结构中的类。

    let x = Test2() 
    if x.isKindOfClass(Test1) {
        println("ok")
    } else {
        println("no")
    }
    

    【讨论】:

    • 这仅适用于objective c 对象,不适用于swift native 对象
    • (在第二种情况下,您将收到“Test2 没有名为 'isKindOfClass' 的成员”
    • 我看到了问题。这仅适用于 NSObject 类层次结构中的类。
    【解决方案3】:

    正如 Cezar 所解释的,它只能“向下”工作。
    但是,您可以像这样重写您的语句:

        var x: AnyObject = Test2()
    
        if x is Test1 {
            println("ok")
        }else{
            println("no")
        }
    

    将 x 声明为 Anyobject,这样您就可以测试它是否符合任何对象类型。
    这样就可以打印了

    【讨论】:

    • 我们是同时写的(53 分钟对 54 分钟前 ;-),我按照你的要求解释了原因
    • ahjahajaajha :) 我正在仔细阅读它;)谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多