使用Swift 4,我在同一个文件中定义了两个结构体,其中一个是私有的,所以这个文件是唯一可以访问它的文件,而且我依赖于结构体的默认/合成初始化器,也就是说,我没有显式定义一个:
private struct A {
private let string: String
...
}
struct B {
func foo() {
let a = A(string: "bar")
...
}
}
但是,这将无法编译,并出现以下错误:
由于“private”保护级别,无法访问“A”初始值设定项
我不希望其他文件可以访问A
,所以我尝试将其设置为fileprivate
(在本场景中应该等效于private
),但还是会发生相同的编译错误(并且它仍然抱怨保护级别为private
)。
有没有办法保留这个结构体fileprivate
,同时仍然获得一个公开所有未初始化属性的合成初始化器?例如A.init(string:)
4条答案
按热度按时间s6fujrry1#
原来“private access level”的抱怨是针对
init
初始化器的,而不是针对结构体的。初始化器的访问级别只与“最难访问”的示例变量一样可访问。如果我将
string
示例变量设置为private
以外的任何变量,错误就会消失:因此,假定
B
现在可以读取A
的string
,它也可以访问A
的初始化器。如果
A
有另一个private
属性,那么它的初始化器也会变成private
:hiz5n14c2#
你可以定义初始化器。它将帮助你保持这个结构
private
。主要问题是private let string
编译器自动添加私有访问级别private init(string: String)
的初始化器。为了修复,您必须定义自己的初始化器
或者你可以使用
fileprivate
访问级别来访问string
属性。在这种情况下你不需要初始化器。qni6mghb3#
下面是解决使用SwiftUI结构体时可能发生的错误的另一种方法。
给定此代码将产生相同的错误,因为变量未初始化或编译器不知道该变量是否保证具有值。
因此,您可以将其设置为可选的、未 Package 的或用值初始化的。
当示例化
MyView()
时,编译器不会抱怨。hmmo2u0o4#
我用过
这对我很有效。