Swift:自我类型,子类化和重写方法

时间:2015-06-01 10:15:23

标签: ios swift override subclassing

以下代码显示了A类,它是B类的超类。该函数具有返回类型' Self'。 B类中重写的方法会出错(请参阅注释)。

class A {
    class func doSomething(param1: String) -> Self {
        var entity = self()

        // Some code goes here...

        return entity
    }
}

class B: A {
    override class func doSomething(param1: String) -> Self {
        var entity = super.doSomething(param1) as! B

        // Some code goes here...

        return entity // Error:'B' is not convertible to 'Self'
    }
}

如果我在Objective-C中使用了instanceType,它会起作用。那我该怎么做呢?或者那是不可能的?

我想让方法成为当前重写类的返回类型。 解决方法是使用init-method接受超类类型作为参数。

这提出了另一个问题:当前类的对象是否等于self()?

那么

之间有什么区别
var entity = someObject as! B

var entity = self() // Current class / file is B

编辑:

class func objectCast<T: A>(obj: A) -> T {
    return obj as! T
}

返回objectCast(实体)而不是实体工作。

class A {
    class func doSomething(param1: String) -> Self {
        var entity = self()

        // Some code goes here...

        return entity
    }
}

class B: A {
    override class func doSomething(param1: String) -> Self {
        var entity = super.doSomething(param1) as! B

        // Some code goes here...

        return objectCast(entity) // No error.
    }
}

所以...为什么它需要这个技巧,似乎我在理解“自我”的含义时遇到了问题。任何人都可以回答我关于差异的问题的第二部分吗?

1 个答案:

答案 0 :(得分:0)

关于你的第二个问题,区别在于第一个选项将在任何子类中返回B,因此子类不会返回Self,而第二个选项将在任何子类中返回Self的实体。如果你把B类标记为最终,那么这两种方法都会有效。