【问题标题】:"Argument passed to call that takes no arguments" when creating an object创建对象时“传递给不带参数的调用的参数”
【发布时间】:2023-04-04 04:55:01
【问题描述】:

我在使用 Swift 类时出错。当我尝试像这样创建一个新对象时

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

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

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

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

【问题讨论】:

    标签: swift class initializer


    【解决方案1】:

    你可以使用结构体获得合成的初始化,就像这样

    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
    

    注意:避免在变量名中使用下划线,使用驼峰式,例如codBare

    【讨论】:

      【解决方案2】:

      来自 Swift 书籍的Structures and Classes 章节:

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

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

      与结构不同,类实例不接收默认的成员初始化器。初始化器在初始化中有更详细的描述。

      除了没有参数的默认初始化器之外,您的类没有初始化器。

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

      【讨论】:

      • 我怀疑可能是它,但不太确定。我会调查的。感谢您的快速回复!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        相关资源
        最近更新 更多