使用Swift 4,我在同一个文件中定义了两个结构,其中一个是私有的,所以这个文件是唯一可以访问它的文件。此外,我依赖于struct的默认初始值设定项,即我没有明确定义一个:
private struct A {
private let string: String
func foo() {}
}
struct B {
func bar() {
A(string: "baz").foo()
}
}
但是这将无法编译,并出现以下错误:
由于'私人'保护级别,'''初始化程序无法访问
我不希望A
可以访问其他文件,因此我尝试通过将其fileprivate
(在此方案中应该等同于private
)来解决此问题。 ,但会发生相同的编译错误(并且仍然抱怨保护级别为private
)。
如何在保留此结构fileprivate
?
答案 0 :(得分:1)
事实证明,初始化程序的保护级别仅与最开放的实例变量一样开放。
如果我将string
实例变量设为private
以外的其他变量,则错误就会消失:
private struct A {
let string: String
// default initializer: init(string: String)
func foo() {}
}
因此,B
现在可以阅读A
string
,它还可以访问A
的初始化程序。
如果A
有另一个private
属性,那么其初始化程序将再次变为private
:
private struct A {
let string: String
private let int: Int
// default initializer: private init(string: String, int: Int)
func foo() {}
}
答案 1 :(得分:0)
您可以定义初始化程序。它将帮助您保留此结构private
。主要问题是private let string
编译器自动添加具有私有访问级别private init(string: String)
的初始化程序。
要修复,您必须定义自己的初始化程序
private struct A {
private let string: String
fileprivate init(string: String) {
self.string = string
}
func foo() {}
}
struct B {
func bar() {
A(string: "baz").foo()
}
}
或者您可以对fileprivate
属性使用string
访问级别。在这种情况下,您不需要初始化程序。
private struct A {
fileprivate let string: String
func foo() {}
}
struct B {
func bar() {
A(string: "baz").foo()
}
}
答案 2 :(得分:-1)
我用过
private let s: String = "Some value"
对我有用。.