swift - 结构初始化程序由于其自己文件的私有保护级别而无法访问
问题描述
使用 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:)
解决方案
事实证明,“私人访问级别”投诉是关于init
ializer,而不是结构。初始化器的访问级别仅与最易访问的实例变量一样可访问。
如果我将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)
...
}
推荐阅读
- ruby-on-rails - 更改 Rails 会话以使用 Capybara 进行测试
- django - 使用 Django Rest Framework 序列化相关枢轴模型
- java - 如何在控制器中获取http请求和查询字符串参数
- php - 如何使用 DataTable 和 Codeigniter 创建 ajax 请求以在同一文件中运行和返回
- r - R,在循环错误后继续使用参数组合
- python - 如何在 Django 中不使用模型或身份验证来存储用户的购物车信息?
- rust - as_deref 函数不会改变我的具体类型
- extjs - 如何在 ext js 中实现进度指示器
- sql - 如何更新 postgresql jsonb 字段中的数组?
- python - 使用元组索引 Numpy 数组维度