gpt4 book ai didi

Swift重写静态方法编译报错

转载 作者:搜寻专家 更新时间:2023-10-30 21:48:39 26 4
gpt4 key购买 nike

我有这两个 swift 类:

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

尝试编译它会引发错误“重写声明需要一个‘override’关键字”,但仅针对类 B 的“get”方法。“list”方法编译正常。 [B]有什么区别?和乙?对于这种情况下的编译器?

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

最佳答案

在类 B 中,方法 list 是与类 A 中的 list 不同的方法。他们只是共享同一个名字,仅此而已。

这两个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)
}
}

关于Swift重写静态方法编译报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40400634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com