默认情况下,如何使Swift中的结构的memberwise初始化器公开?

默认情况下,如何使Swift中的结构的memberwise初始化器公开?,swift,struct,initialization,Swift,Struct,Initialization,我有一个定义结构的swift框架: public struct CollectionTO { var index: Order var title: String var description: String } 但是,我似乎无法使用另一个导入库的项目中的隐式成员初始值设定项。错误为“CollectionTO”无法初始化,因为它没有可访问的初始化器。i、 它没有给默认的隐式成员初始化器public关键字 var collection1 = CollectionTO(i

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

public struct CollectionTO {
    var index: Order
    var title: String
    var description: String
}
但是,我似乎无法使用另一个导入库的项目中的隐式成员初始值设定项。错误为“CollectionTO”无法初始化,因为它没有可访问的初始化器。i、 它没有给默认的隐式成员初始化器public关键字

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")
我必须添加自己的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;
    }

}
。。。但我不希望有其他人知道的方式?

引用手册:

“结构类型的默认成员初始值设定项 如果结构类型的任何存储属性是私有的,则结构类型的默认memberwise初始值设定项被视为私有的。否则,初始值设定项的访问级别为内部

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


节选自第节。

我们现在有一个ruby gem,但不可能有默认的memberwise初始值设定项,至少您可以通过以下步骤快速创建一个:

更新:Xcode 11及更高版本

正如Brock Batsell在评论中提到的,对于Xcode 11和更高版本,您需要做的就是:

  • 右键单击类或结构名称并选择重构-> 生成成员初始值设定项
Xcode 10和更早的答案

  • 将对象临时设为类而不是结构
  • 拯救
  • 右键单击类名并选择重构-> 生成成员初始值设定项
  • 将其更改回结构

  • 嗯,那真烦人([说:“引用Chris Lattner的话:Swift默认的成员初始化行为至少有这些缺陷(IMO):2)访问控制+成员初始化通常要求您自己实现它”。因此,可能这只是一个无缘无故存在的缺陷。找不到更多关于这方面的参考资料。@DanLoewenherz是的,这很不方便。理由是:公共类型默认为具有内部成员,而不是公共成员。如果希望类型成员为公共成员,则必须显式将其标记为公共成员。此要求确保类型的面向公共的API是您选择发布的,并避免错误地将类型的内部工作呈现为公共API摘自:苹果公司《Swift编程语言》iBooks。编译器指令最好覆盖默认行为,并将其公开。imo,对于默认行为,内部是一个糟糕的选择。它基本上保证您在第一次从外部引用模块时会遇到意外问题。为什么不将所有内容都默认为private,以便我们可以立即知道有些东西没有被赋予正确的访问级别,然后决定它应该是公共的还是内部的?太棒了。非常感谢你解决了这个快速的缺陷,也激励你实际使用类而不是结构,这是一个超级技巧!!从Xcode 11开始,你也可以在结构上使用Generate Memberwise初始值设定项!太棒了!!!太棒了答案不正确,但这是一个非常好的提示!帮助了我很多!非常棒的解决方案!!我已经为
    swift\u republic
    创建了一个包装器,运行良好。