在 swift class 中没有初始化错误

Getting no initialisation error in swift class

大家好,我是 swift 的新手,我是一个字符串,用于将用户凭据存储在 LoginViewController 中的结构对象中的用户默认值中。下面是我的代码,

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 中 class 显示错误“LoginViewController 没有初始化程序”

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

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

  1. 使logindataValue成为Optional:

在您的 LoginViewController 中,将 logindataValue 的定义更改为:

var logindataValue: LoginData?

它会被赋予一个默认的初始值nil。使用时必须拆开包装,但没关系。

  1. logindataValue一个不同的默认值:

在您的 LoginViewController 中,将 logindataValue 的定义更改为:

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

我不推荐这种方法。创建一个具有无意义值的空 LoginData 对象似乎是不对的。最好使用 Optional 值。但是,如果您可以提供一些其他有意义的默认值,那么这可能会起作用。

  1. LoginViewController 添加初始化程序:

这是最复杂的,因为为 UIViewController 的子类创建自定义初始化程序并不容易。您将必须添加一个包含 logindataValue 参数的初始化程序,您可以使用该参数来初始化 logindataValue。但是您还必须覆盖 init?(coder: NSCoder),这对您来说是一种痛苦,而且可能不是您所需要的。

所以我的建议是 logindataValue 变成 Optional