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

Swift 结构初始值设定项由于其自身文件的私有保护级别而无法访问,swift,Swift,使用Swift 4,我在同一个文件中定义了两个结构,其中一个是私有的,所以这个文件是唯一可以访问它的文件。此外,我还依赖于结构的默认初始值设定项,即,我没有明确定义一个初始值设定项: private struct A { private let string: String func foo() {} } struct B { func bar() { A(string: "baz").foo() } } 但是,这将无法编译,并出现以下错误: 由于“专用”保护级别,“

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

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()
,不带参数。