您是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没有初始化器”
如何防止此错误?在这种情况下,这是正确的做法吗?
答案 0 :(得分:1)
Swift抱怨说你没有初始化var logindataValue: LoginData
中的LoginViewContoller
。你可以通过几种方式解决这个问题。
logindataValue
成为Optional
:在LoginViewController
中将logindataValue
的定义更改为:
var logindataValue: LoginData?
它将被赋予默认初始值nil
。你在使用它时必须打开它,但没关系。
logindataValue
提供不同的默认值:在LoginViewController
中将logindataValue
的定义更改为:
var logindataValue = LoginData(username: "", password: "")
我不推荐这种方法。创建一个具有无意义值的空LoginData
对象似乎并不正确。最好使用Optional
值。但是如果你可以给出一些其他有意义的默认值,那么这可能会有效。
LoginViewController
添加初始值设定项:这是最复杂的,因为为UIViewController
的子类创建自定义初始值设定项并不容易。您必须添加包含logindataValue
参数的初始值设定项,您可以使用该参数初始化logindataValue
。但是你也必须覆盖init?(coder: NSCoder)
,这是你知道什么的痛苦,可能不是你需要的。
所以我的建议是让logindataValue
成为Optional
。