You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:42:02