由于来自其自身文件的私有保护级别,Struct初始化程序无法访问

时间:2018-06-12 05:00:30

标签: swift

使用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

的同时避免说明初始值设定项

3 个答案:

答案 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"

对我有用。.