创建对象时“传递给调用的参数不带参数”

时间:2019-03-19 16:46:53

标签: swift class initializer

在使用Swift类时出现错误。当我尝试创建这样的新对象

let prod_obj = Produs(nume: nume_prod, cod_bare: cod_ext)

我收到错误“传递给调用的参数不带参数”,我也不知道为什么。我已经阅读了一些文档,这与他们的使用方法完全相同。这是我班的样子:

class Produs {
    var nume: String!
    var cod_bare: String!
}

我想我可能需要添加一个初始化程序,但是我不明白为什么这对我来说是必要的。

3 个答案:

答案 0 :(得分:2)

从Swift书的Structures and Classes章开始:

  

结构类型的成员级初始化程序   所有结构都有一个自动生成的成员初始化器,您可以使用该初始化器来初始化新结构实例的成员属性。可以通过名称将新实例的属性的初始值传递给成员初始化器:

let vga = Resolution(width: 640, height: 480)
     

与结构不同,类实例不会接收默认的逐成员初始化器。初始化程序中会详细描述初始化程序。

您的课程没有初始化程序,除了没有参数的默认初始化程序之外。

要么通过两个参数添加所需的初始化程序,要么将您的类更改为结构。

答案 1 :(得分:2)

您可以使用Struct来获取合成的init,就像这样

#install.packages("lintr")
lintr::lint("/path/to/file/Report.Rmd")

对于一个类,您可以提供一个初始化程序:

struct Produs {
    let nume: String
    let codBare: String
}
let prodObj = Produs(nume: numeProd, codBare: codBare)

class Produs {
    var nume: String
    var codBare: String

    init (nume: String, codBare: String) {
        self.nume = nume
        self.codBare = codBare
    }
}
let prodObj = Produs(nume: numeProd, codBare: codBare)

注意:避免在变量名中使用下划线,而使用诸如class Produs { var nume: String! var codBare: String! } let prodObj = Produs() prodObj.nume = numeProd prodObj.codBare = codBare 之类的camelCase

答案 2 :(得分:0)

仅在结构上获得带有参数的合成init。在类上,如果提供属性的默认值,则会得到init(),否则必须实现它。

相关问题