在swift类中没有初始化错误

时间:2016-04-29 18:00:33

标签: swift class struct initialization nsuserdefaults

您是swift的新手我是一个字符串,用于在LoginViewController中的struct对象的用户默认值中存储用户凭据。以下是我的代码,

class User: NSObject {
    //MARK: Properties
    var name: String
    var email: String
    var loginData: LoginData

    //MARK: Initialization
    init(name: String, email:String, loginData: LoginData) {
        self.name = name
        self.email = email
        self.loginData = loginData
    }
}

这里LoginData是一个结构

struct LoginData {
    var username: String
    var password: String
}
提交寄存器数据时

将值指定为

let logindata = LoginData (username: username, password: password)        
let v = User(name: nameval, email: emailval, loginData:logindata)

在LoginViewContoller中,我有一个开关按钮,用于将用户凭据保存到我创建的NSUserdefaults

var logindataValue: LoginData

并按用户默认值存储如下

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(logindataValue.username, forKey: "username")
defaults.setObject(logindataValue.password, forKey: "password")
defaults.synchronize()

但是在LoginViewController类中显示错误为“LoginViewController没有初始化器”

如何防止此错误?在这种情况下,这是正确的做法吗?

1 个答案:

答案 0 :(得分:1)

Swift抱怨说你没有初始化var logindataValue: LoginData中的LoginViewContoller。你可以通过几种方式解决这个问题。

  1. logindataValue成为Optional
  2. LoginViewController中将logindataValue的定义更改为:

    var logindataValue: LoginData?
    

    它将被赋予默认初始值nil。你在使用它时必须打开它,但没关系。

    1. logindataValue提供不同的默认值:
    2. LoginViewController中将logindataValue的定义更改为:

      var logindataValue = LoginData(username: "", password: "")
      

      我不推荐这种方法。创建一个具有无意义值的空LoginData对象似乎并不正确。最好使用Optional值。但是如果你可以给出一些其他有意义的默认值,那么这可能会有效。

      1. LoginViewController添加初始值设定项:
      2. 这是最复杂的,因为为UIViewController的子类创建自定义初始值设定项并不容易。您必须添加包含logindataValue参数的初始值设定项,您可以使用该参数初始化logindataValue。但是你也必须覆盖init?(coder: NSCoder),这是你知道什么的痛苦,可能不是你需要的。

        所以我的建议是让logindataValue成为Optional