Swift访问修饰符正确用法:跨模块访问时结构体是否需声明为public?
问题结论
首先明确结论:你必须将Post结构体本身声明为public,才可以实现其他模块访问该结构体及其属性的需求。
你未感知到差异的原因
你目前测试场景大概率是在同一个模块内(比如所有代码都在主工程Target、或者同一个Framework Target内),Swift默认的类型访问级别是internal,internal级别的类型/属性在同一模块内的访问权限和public完全一致,只有跨模块调用时才会出现权限差异。
Swift访问控制核心规则
- 成员的访问级别不能高于其所属类型的访问级别
- 未显式声明访问级别的类型,默认是
internal级别 - 如果你不给
Post加public修饰符,哪怕所有属性都声明为public,属性的实际有效访问级别也会被限制为internal,其他模块根本无法识别到Post这个类型,自然也无法访问它的任何属性。
正确写法
public struct Post { public let author: String public let description: String public let image: String public let likes: Int public let views: Int // 如果需要其他模块可以实例化Post,需要显式声明public构造器 public init(author: String, description: String, image: String, likes: Int, views: Int) { self.author = author self.description = description self.image = image self.likes = likes self.views = views } }
注意:Swift结构体默认生成的成员逐一构造器访问级别是internal,如果需要其他模块能直接创建Post实例,必须手动实现public级别的构造方法。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

