当前位置: 首页 > 面试题库 >

默认情况下,如何在Swift中将成员初始化器公开?

干高歌
2023-03-14
问题内容

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

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

但是,我似乎无法从导入该库的另一个项目中使用隐式成员明智的初始化程序。错误是“
CollectionTO”无法初始化,因为它没有可访问的初始化程序。也就是说,它没有为默认的隐式成员明智的初始化程序提供public关键字。

var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")

我必须像这样添加自己的初始化方法:

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

}

…但是我宁愿不知道是否还有其他人知道的方法?


问题答案:

引用手册:

“结构类型的默认成员明智的初始化程序如果结构的任何存储属性是私有的,则将结构类型的默认成员明智的初始化程序视为私有。否则,该初始化程序具有内部访问级别。

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

摘自“雨燕程序设计语言”,部分“访问控制”。



 类似资料:
  • 我有一个定义结构的swft框架: 但是,我似乎无法使用另一个导入库的项目中的隐式成员初始值设定项。错误为“CollectionTO”无法初始化,因为它没有可访问的初始化器。i、 它没有给默认的隐式成员初始化器public关键字。 我必须像这样添加我自己的init方法: ... 但如果有其他方法让人知道,我宁愿不要?

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

  • 如果我有一个struct Foo和一个struct Bar: 如果我初始化一个条并打印正确得到的值: 但是现在如果我声明这样的构造函数: 我失去了Bar::foo的默认构造,程序输出了32764 0 5! 为什么我不得不像这样无声地初始化每个成员变量: 只要我声明一个构造函数?在这种情况下,为什么默认构造不起作用?

  • 问题内容: 我是Golang的新手,所以分配它会让我发疯: 之后,我打电话给: 这时我得到了nil指针恐慌。 我通过使用另一个函数并在之后调用它来解决该问题: 但是我想知道,是否有可能摆脱这种样板初始化? 问题答案: 您只需要一个构造函数。常用的模式是 如果结构中有更多字段,启动goroutine作为后端或注册终结器,则可以在此构造函数中完成所有操作。

  • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

  • 问题内容: 我正在跟踪Swift和Objective-C Runtime,它适用于常规方法。 我喜欢使用init方法,据我了解,init就像一个类方法。因此,我尝试将初始化作为实例和类方法。但这似乎不起作用 我可以使用Objective C使其工作,只是想知道如何在Swift中使其工作 摘录自我的要旨 问题答案: 为方法创建选择器时,应使用Obj C方法签名作为选择器的基础,因为使用Obj C运行