Swift协议多个匹配函数命名错误

Swift protocol multiple matching functions named error

我有一个协议 class 如下所示,

protocol Test {
    func test<T>(with string: String) -> Array<T>
    func test<T>(with string: String) -> Array<[T]>
}

class BaseTest {

        func test<T>(with string: String) -> Array<T> {
            return []

        }

        func test<T>(with string: String) -> Array<[T]> {
            return []
        }
    }

它工作得很好,但是当我符合协议时出现这个错误,

"1.Multiple 匹配名为错误的函数".

我不明白为什么会这样。

假设您有以下代码:

let protocolVariable: Test = BaseTest()
let array: [[Int]] = protocolVariable.test(with: "")

第二行会调用BaseTest中的哪个test? returns [[T]]test 还是 returns [T]test?它可以调用两者,不是吗?它可以调用第一个 test,因为 T 可以推断为 [Int]。它可以调用第二个 test 因为 T 可以推断为 Int.

不符合协议还是会报错,但实际上报错的地方是在调用的地方:

let array: [[Int]] = BaseTest().test(with: "") // error

当你遵守协议时,编译器会尝试将你的方法与协议中的方法进行匹配(因为它必须检查你的 class 是否符合协议),所以它会早点发现这个歧义。

如果删除第二个testBaseTest将符合协议:

class BaseTest: Test {
    func test<T>(with string: String) -> Array<T> {
        return []

    }
}

但是第一段代码还是会出错。如果您尝试将其分配给 [[Int]],因为这次您指的是两个 protocol 方法中的哪一个是不明确的。