首页 > 解决方案 > 将成员标记为私有导致 Argument Passed to Call That Takes No Arguments

问题描述

编译:

struct Foo {
    var g: Double = 5.0
}

struct Bar {
    var h: Double = 5.0
    var foo = Foo()
}

var bar = Bar(h: 6)

添加“private”并且不再编译,标题中有上述错误:

struct Foo {
    var g: Double = 5.0
}

struct Bar {
    var h: Double = 5.0
    private var foo = Foo()
}

var bar = Bar(h: 6) // compiler error on this line

为什么会这样?

标签: swift

解决方案


这是因为对于一个结构,如果它的任何成员是私有的,则合成的成员 init 将是私有的。因此,您将获得一个不带参数的 init,因为所有属性都有默认值(如果至少一个非可选属性缺少默认值,则根本不会合成任何 init)。

来自 Swift 编程语言书

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

因此,在您的情况下,您将需要为您的结构编写自定义初始化


推荐阅读