由于来自其自身文件的私有保护级别,结构初始值设定项无法访问

Gob*_*obe 14 swift

使用 Swift 4,我在同一个文件中定义了两个结构,其中一个是私有的,所以这个文件是唯一可以访问它的。此外,我依赖于结构的默认初始值设定项,即我没有明确定义一个:

private struct A {
  private let string: String
  func foo() {}
}

struct B {
  func bar() {
    A(string: "baz").foo()
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,这将无法编译并出现以下错误:

由于“私有”保护级别,“A”初始值设定项无法访问

我不想A访问其他文件,所以我试图通过制作它来解决它fileprivate(这应该相当于private在这种情况下),但是会发生相同的编译错误(并且它仍然抱怨保护级别是private)。

如何在保留此结构的同时避免显式初始化fileprivate

Gob*_*obe 20

事实证明,初始化程序的访问级别仅与最易访问的实例变量一样可访问。

如果我使string实例变量不是private,错误就会消失:

private struct A {
  let string: String
  // default initializer: init(string: String)
  func foo() {}
}
Run Code Online (Sandbox Code Playgroud)

因此,鉴于B现在可以读取A's string,它还可以访问A's 的初始化程序。

如果A有另一个private属性,那么它的初始化程序将再次变为private

private struct A {
  let string: String
  private let int: Int
  // default initializer: private init(string: String, int: Int)
  func foo() {}
}
Run Code Online (Sandbox Code Playgroud)