首页 > 解决方案 > 结构初始化程序由于其自己文件的私有保护级别而无法访问

问题描述

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

private struct A {
  private let string: String
  ...
}

struct B {
  func foo() {
    let a = A(string: "bar")
    ...
  }
}

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

由于“私人”保护级别,“A”初始化程序不可访问

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

有没有办法保留这个结构fileprivate并仍然获得一个公开所有未初始化属性的合成初始化程序?IEA.init(string:)

标签: swift

解决方案


事实证明,“私人访问级别”投诉是关于initializer,而不是结构。初始化器的访问级别仅与最易访问的实例变量一样可访问。

如果我将string实例变量设为 以外private的任何值,错误就会消失:

private struct A {
  let string: String
  // synthesized initializer:
  // init(string: String)
}

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

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

private struct A {
  let string: String
  private let int: Int
  // synthesized initializer:
  // private init(string: String, int: Int)
  ...
}

推荐阅读