当前位置: 首页 > 知识库问答 >
问题:

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

颜宸
2023-03-14

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

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;
    }

}

... 但如果有其他方法让人知道,我宁愿不要?

共有2个答案

益阳平
2023-03-14

虽然无法使用默认的memberwise初始值设定项,但至少可以通过以下步骤快速创建一个初始值设定项:

更新:Xcode 11及更高版本

正如布洛克·巴特塞尔在评论中提到的,对于Xcode 11和以后的版本,您只需要这样做:

  • 右键单击类或结构名称并选择重构-

Xcode 10和更早的答案

  1. 将对象临时设为类而不是结构
潘弘博
2023-03-14

引用手册:

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

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

摘自“Swift编程语言”中的“访问控制”一节。

 类似资料:
  • 问题内容: 我有一个定义结构的快速框架: 但是,我似乎无法从导入该库的另一个项目中使用隐式成员明智的初始化程序。错误是“ CollectionTO”无法初始化,因为它没有可访问的初始化程序。也就是说,它没有为默认的隐式成员明智的初始化程序提供public关键字。 我必须像这样添加自己的初始化方法: …但是我宁愿不知道是否还有其他人知道的方法? 问题答案: 引用手册: “结构类型的默认成员明智的初始

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • 问题内容: 我有一个对象 我用两种方式初始化它 这是输出 似乎builder没有获得默认值。我在属性中添加了注释,对象现在看起来像这样 这是控制台输出 我怎样才能使他们俩都成为? 问题答案: 我的猜测是,这是不可能的(没有删除代码)。但是,为什么不仅仅实现所需的构造函数呢?Lombok旨在使您的生活更轻松,如果Lombok无法解决某些问题,请按照老式的方式进行操作。 控制台输出:

  • 我正在使用一个PHP库将一个文件上传到我的bucket中。我已经将ACL设置为public read write,它可以正常工作,但文件仍然是私有的。 我发现如果我把被授权人改成所有人,文件就会公开。我想知道的是,如何将bucket中所有对象的默认grante设置为“Everyone”。或者有没有另一种默认公开文件的解决方案? 我使用的代码如下:

  • I一个对象的初始化值,然后声明同一类的另一个对象,但默认情况下,第一个对象的值分配给第二个对象,而不是默认的空值。 } 是存储有关学生信息的类。 }在这里,我创建了两个对象,首先是初始化第一个对象(st1),然后我用默认对象声明第二个对象,并且在这两个对象上我都调用了同一个对象,为什么用第二个对象调用的方法正在打印传递给第一个对象的值为什么它不打印默认空值。 输出: “C:\Program Fil

  • 问题内容: 我想在命令行上输入-T3来节省时间,因为我希望我能做的所有Maven构建都可以运行多线程。 Maven 3.3.9我用谷歌搜索,但没有发现任何有希望的东西,只是建议为命令行选择添加一个环境变量,并将其附加到命令行上的每个maven调用中。 这样,每次仍然需要手动步骤(输入环境变量的名称)来进行并行构建。 我想在mvn settings.xml文件中进行全局配置。 问题答案: 你不能配置