Swift私有类型隐式初始化器访问权限疑问:为何B可实例化私有A?
问题解析
你遇到的差异源于Swift中显式私有初始化器和自动合成初始化器的访问级别规则不同:
1. 显式声明private init()的情况
private struct A { private init() {} } private struct B { var a = A() // 编译错误 ⚠️ }
这里显式声明的private init()访问级别是private,按照Swift规则,private成员只能在定义它的类型内部被调用。因此即使A和B在同一文件中,B也无法访问这个初始化器,导致编译错误。
2. 自动合成初始化器的情况
private struct A { } private struct B { var a = A() // 编译成功 ✅ }
当你不为私有结构体A定义任何自定义初始化器时,Swift会自动合成一个默认无参初始化器。根据Swift的规则:
私有结构体的自动合成默认初始化器,访问级别为fileprivate,而非private。
fileprivate级别的成员允许在同一源文件内的任何实体访问,因此和A在同一文件中的B可以正常调用这个初始化器创建A的实例。
总结来说,自动合成的初始化器会根据类型的访问级别自动调整自身的访问范围,而显式声明的private初始化器则严格限制在类型内部使用。
内容的提问来源于stack exchange,提问作者chicken soup
相关产品推荐
相关产品推荐

