Swift报错:子项目School结构体初始化器因internal保护级别无法访问
解决Swift跨模块初始化器访问权限问题
这个报错的根源其实是Swift的访问级别规则在搞鬼——你在子项目里把School结构体声明为public,但自定义的初始化器如果没显式标注访问级别,默认会是internal(仅模块内部可见)。而主项目作为独立模块,没法访问子项目里的internal成员,所以才会报“初始化器因‘internal’保护级别无法访问”的错。
解决方法很简单:给初始化器显式加上public修饰符
修改子项目里的School结构体代码如下:
public protocol MyProtocol { func print() } public struct School { var name: String var delegator: MyProtocol // 给初始化器加上public修饰符,开放跨模块访问权限 public init(name: String, delegate: MyProtocol) { self.name = name self.delegator = delegate } }
补充说明
Swift的访问级别规则有个容易忽略的细节:public类型的自定义成员(包括初始化器)默认访问级别是internal,只有显式声明public,才能让跨模块的代码(比如你的主项目)访问到。你之前的代码里,初始化器没有加public,所以主项目无法调用它。
修改之后,主项目里给UIViewController扩展遵循MyProtocol后,就能正常初始化School实例了。
内容的提问来源于stack exchange,提问作者Leem
相关产品推荐
相关产品推荐

