具有重复函数名称的SWIFT协议一致性

nhjlsmyf  于 2022-10-23  发布在  Swift
关注(0)|答案(2)|浏览(190)
class A {
    func test(string: String, another defaultValue: String = "") {
        ///...
    }
}

class B {
    func test(string: String, different defaultValue: Bool = true) {
        ///...
    }
}

protocol Test {
    func test(string: String)
}

extension A: Test {
    func test(string: String) {
        self.test(string: string)
    }
}

extension B: Test {
    func test(string: String) {
        self.test(string: string)
    }
}

当我这样做时,我得到以下错误
函数调用导致无限递归
如何对函数名称相似的类确认协议Test

kgsdhlau

kgsdhlau1#

当A或B符合测试时,程序无法知道您调用的是哪个.test,因为A和B中的内部.test方法具有缺省值。
要解决歧义,您可以具体说明:

extension A: Test {
    func test(string: String) {
      self.test(string: string, another: "")
    }
}

extension B: Test {
    func test(string: String) {
      self.test(string: string, different: true)
    }
}
ruarlubt

ruarlubt2#

您必须使用完整签名调用类方法:

extension A: Test {
    func test(string: String) {
        self.test(string: string, another: "")
    }
}

extension B: Test {
    func test(string: String) {
        self.test(string: string, different: true)
    }
}

由于Swift允许方法重载,因此您可以使用相同的函数名称和不同的签名。在您的示例中,类方法与协议方法具有不同的签名,因此这是可以接受的。但是,类方法有缺省值,可以在没有完整签名的情况下调用,在这种情况下,它是不明确的,因为签名变得相同。

相关问题