gpt4 book ai didi

swift - 编译器不将私有(private)扩展中的方法识别为私有(private)

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:02 26 4
gpt4 key购买 nike

我有以下代码:

class C {
private enum E {
// ...
}
}

private extension C {
func f(e: E) { // error: Method must be declared private because its parameter uses a private type
// ...
}
}

如果我将错误方法设置为 private,编译器错误就会消失。我想知道这是 Swift 中的错误还是我没有得到什么?

最佳答案

在顶层,private 等同于 fileprivate – 因为 private 意味着只能在封闭范围内访问(以及同一个文件)扩展),并且在顶层,文件那个范围。

所以你这里的内容等同于:

class C {
private enum E {
// ...
}
}

<b>fileprivate</b> extension C {
// error: Method must be declared private because its parameter uses a private type.
func f(e: E) {
// ...
}
}

(出于这个原因,为了清楚起见,我总是在顶层写 fileprivate 而不是 private)

这让问题更容易理解——扩展方法f默认是fileprivate,因此可以在整个文件范围内访问,但它的参数是类型化的作为 E,它只能在类 C 的范围内访问。

正如您所发现的,您可以将 f 标记为 private:

class C {
private enum E {
// ...
}
}

fileprivate extension C {
<b>private</b> func f(e: E) {
// ...
}
}

或者将E标记为fileprivate:

class C {
<b>fileprivate</b> enum E {
// ...
}
}

fileprivate extension C {
func f(e: E) {
// ...
}
}

为了解决扩展方法 f 与其参数类型 E 具有相同可见性的问题。

关于swift - 编译器不将私有(private)扩展中的方法识别为私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770221/

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