我有两个快速的课程:
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?对于这种情况下的编译器?
编辑:另请注意,无法添加“覆盖”。我收到错误'无法覆盖静态方法'。
答案 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
不能被覆盖。