Swift 结构初始值设定项由于其自身文件的私有保护级别而无法访问
使用Swift 4,我在同一个文件中定义了两个结构,其中一个是私有的,所以这个文件是唯一可以访问它的文件。此外,我还依赖于结构的默认初始值设定项,即,我没有明确定义一个初始值设定项:Swift 结构初始值设定项由于其自身文件的私有保护级别而无法访问,swift,Swift,使用Swift 4,我在同一个文件中定义了两个结构,其中一个是私有的,所以这个文件是唯一可以访问它的文件。此外,我还依赖于结构的默认初始值设定项,即,我没有明确定义一个初始值设定项: private struct A { private let string: String func foo() {} } struct B { func bar() { A(string: "baz").foo() } } 但是,这将无法编译,并出现以下错误: 由于“专用”保护级别,“
private struct A {
private let string: String
func foo() {}
}
struct B {
func bar() {
A(string: "baz").foo()
}
}
但是,这将无法编译,并出现以下错误:
由于“专用”保护级别,“A”初始值设定项不可访问
我不希望其他文件可以访问A
,因此我尝试将其设置为fileprivate
(在这种情况下,这应该相当于private
),但同样的编译错误也会发生(它仍然抱怨保护级别是private
)
如何在保持此结构的私有性时避免显式指定初始值设定项?事实证明,初始值设定项的访问级别仅与最可访问的实例变量一样可访问 如果我将
字符串
实例变量设置为非私有
,则错误消失:
private struct A {
let string: String
// default initializer: init(string: String)
func foo() {}
}
因此,鉴于B
现在可以读取A
的字符串
,它还可以访问A
的初始值设定项
private struct A {
fileprivate let string: String
func foo() {}
}
struct B {
func bar() {
A(string: "baz").foo()
}
}
如果A
具有另一个private
属性,则其初始值设定项将再次变为private
:
private struct A {
let string: String
private let int: Int
// default initializer: private init(string: String, int: Int)
func foo() {}
}
您可以定义初始值设定项。它将帮助您保持此结构的私有性。主要问题是
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()
}
}
我曾经
private let s: String = "Some value"
它对我很有用。谢谢,但是OQ会说“我如何避免显式使用初始值设定项”,在这种情况下,您应该为
string
属性使用fileprivate
访问级别。请检查我上面编辑的答案。可能您使用的是Swift 5.1+,因此您使用的是,它创建了一个init
,其中“Some value”作为s
的默认值。另外,我在原始问题中发布的代码仍然失败,但现在它表示传递给调用的参数不带参数
,这非常有意义,因为属性是私有的,所以唯一公开的初始值设定项是init()
,不带参数。