我如何默认公开Swift中结构的成员初始化器?

ban*_*isa 144 struct initialization swift

我有一个定义结构的快速框架:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法使用另一个导入库的项目中的隐式成员智能初始化程序.错误是'CollectionTO'无法初始化,因为它没有可访问的初始化程序.即它没有给出默认的隐式成员明智的初始化者public关键字.

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")
Run Code Online (Sandbox Code Playgroud)

我必须添加我自己的init方法,如下所示:

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String

    public init(index: Order, title: String, description: String) {
        self.index = index;
        self.title = title;
        self.description = description;
    }

}
Run Code Online (Sandbox Code Playgroud)

...但是如果还有其他人知道的话,我宁可不要这样做?

ban*_*isa 233

我阅读了手册:

"结构类型的默认成员初始化程序如果结构的任何存储属性是私有的,则结构类型的默认成员初始化程序被视为私有.否则,初始化程序的访问级别为内部.

与上面的默认初始化程序一样,如果您希望在另一个模块中使用成员初始化程序时可以初始化公共结构类型,则必须自己提供一个公共成员初始化程序作为类型定义的一部分.

摘自"Swift编程语言","访问控制"部分.

  • 嗯,这很烦人.:( (222认同)
  • 编译器指令很好地覆盖默认行为,并使其公开. (15认同)
  • @DanLoewenherz是的,这很不方便.理由是:"公共类型默认有内部成员,而不是公共成员.如果您希望类型成员是公共的,则必须明确标记它.这个要求确保了一个类型的面向公众的API是你选择发布的东西,并且避免错误地将类型的内部工作表示为公共API."摘自:Apple Inc."Swift编程语言."iBooks .https://itun.es/gb/jEUH0.l (8认同)
  • 内部是默认的imo的可怕选择.它基本上保证在第一次外部引用模块时会遇到意外问题.为什么不将所有内容默认为私有,以便我们可以在没有给出正确的访问级别的情况下立即判断,然后确定它应该是公共的还是内部的? (6认同)
  • [https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md](0018-flexible-memberwise-initialization.md)说:"引用克里斯拉特纳: Swift的默认成员初始化程序行为至少存在这些缺陷(IMO):2)访问控制+成员init通常要求您自己实现它".所以也许这只是一种缺乏,特别是没有任何理由存在.找不到更多关于此的参考资料. (5认同)
  • Xcode 可以在结构上自动生成初始化程序以节省一些时间。右键单击结构体的标题,选择“REFACTOR”->“GENERATE MEMBERWISE INITIALISER”-> 手动声明初始化程序公共。 (2认同)

JP *_*ino 32

至少不可能使用默认的成员初始化程序,但您可以通过以下步骤快速进行初始化:

  1. 暂时将对象设为类而不是结构
  2. 保存
  3. 右键单击类名称,然后选择“重构”->“生成成员初始化器”
  4. 将其更改回结构

  • 从 Xcode 11 开始,您也可以在结构上使用“生成成员初始化程序”! (11认同)