【问题标题】:Getting no initialisation error in swift class在 swift 类中没有初始化错误
【发布时间】:2016-04-29 18:00:32
【问题描述】:

嗨,我是 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 has no initializers”

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

【问题讨论】:

  • 您提供了很多关于您的各种模型对象的不相关数据,但几乎没有包含任何实际给您错误的类,LoginViewController。我猜它丢失了,因为它可能“太大”,这意味着您甚至没有尝试制作MCVE。但是,如果您想阅读有关 Swift 初始化程序的相关信息,我建议您 start here

标签: swift class struct initialization nsuserdefaults


【解决方案1】:

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

【讨论】:

  • ... 或... 创建一个初始化器。