如何判断子类是否覆盖了Swift中的方法

时间:2015-01-30 16:49:57

标签: swift

我有一个Swift类Parent,它有一个方法doSomething(),我想检测(在Parent中)子类是否已覆盖doSomething()。我该怎么做?

class Parent {
    func doSomething() {}
    func subclassOverridesDoSomething() -> Bool {
        // what goes here?
        return true
    }
}

class Child: Parent {
    override func doSomething() {}
}

我知道我可以用NSObject甚至Objective C运行时函数来完成这个,但是如何使用Swift类呢?

2 个答案:

答案 0 :(得分:1)

如果使用dynamic公开函数,则可以使用Objective-C运行时:

class Parent {
    func doSomething() {}
    func subclassOverridesDoSomething(t:Parent.Type) -> Bool {
        let originalMethod = class_getInstanceMethod(t, "doSomething")
        return originalMethod != nil
    }
}

class Child: Parent {
    dynamic override func doSomething() {}
}

Parent().subclassOverridesDoSomething(Child.self)

如果省略dynamic,则无法正常工作,因为Objective-C无法查看该方法。

答案 1 :(得分:0)

Well Swift并没有真正提供这样做的方法。

另外在我看来,使用像method_getImplementationNSObject这样的Objective-c方法没有任何缺点。您将不得不使用objective-c为您解决问题的方法。

例如:

let selector = Selector("viewWillAppear:")        
let originalMethod = class_getInstanceMethod(YourClass, selector)