Swift重写静态方法编译错误

时间:2016-11-03 11:43:42

标签: swift static compilation compiler-errors

我有两个快速的课程:

class A {    
    static func list(completion: (_ result:[A]?) -> Void) {
        completion (nil)
    }        
    static func get(completion: (_ result:A?) -> Void) {
        completion (nil)
    }
}


class B: A {    
    static func list(completion: (_ result:[B]?) -> Void) {
        completion (nil)
    }    
    static func get(completion: (_ result:B?) -> Void) {
        completion (nil)
    }        
}

尝试编译这会引发错误“覆盖声明需要'覆盖'关键字”,但仅适用于B类的'get'方法。'list'方法编译良好。 [B]有什么区别?和B?对于这种情况下的编译器?

编辑:另请注意,无法添加“覆盖”。我收到错误'无法覆盖静态方法'。

2 个答案:

答案 0 :(得分:20)

在课程B中,方法list是与list课程中A分开的方法。他们只是拥有相同的名字,这就是全部。

两种list方法的参数实际上是不同的:

// A.list
static func list(completion: (_ result:[A]?) -> Void) {
// B.list
static func list(completion: (_ result:[B]?) -> Void) {

A.list采用(_ result: [A]?) -> Void类型的参数,而B.list采用(_ result: [B]?) -> Void。闭包类型参数列表中的数组类型不同!

所以你没有覆盖任何东西,你只是超载。

注意:

static方法永远不能被覆盖!如果要覆盖方法,请使用class代替static

class A {
    class func get(completion: (_ result:A?) -> Void) {
        completion (nil)
    }
}


class B: A {
    override class func get(completion: (_ result:B?) -> Void) {
        completion (nil)
    }
}

答案 1 :(得分:0)

简而言之,按照规则,static methods不能被覆盖。