从 NSObject 继承的对象导致错误 属性 'self._username' 未在 super.init 调用时初始化

Object inherit from NSObject causes error Property 'self._username' not initialized at super.init call

我创建了继承自 NSObject 的 UserModel 对象。由于 "Property 'self._username' not initialized at super.init call",我在重写 init() 时遇到问题,给我错误。有人可以告诉我如何解决吗?我还应该始终继承 NSObject 吗?

class UserModel:NSObject
{
    let _username:String
    let _password:String
    let _isAuthenticated:Bool
    let _isManager:Bool

    init(username:String = "",password:String = "" ,isAuthenticated:Bool = false,isManager:Bool = false)
    {
        self._username = username
        self._password = password
        self._isAuthenticated = isAuthenticated
        self._isManager = isManager
    }


    override init() {
        super.init()
    }


}

在Swift中,只有可选类型可以包含nil。您要么必须使用空字符串初始化您的用户名 属性,要么使用可选类型

let _username: String?

let _username: String = ""

您的 _username_password_isAuthenticated_isManager 变量不是可选的。一旦初始化程序完成,它们必须有一个值。您的第二个初始化程序对 super.init() 的调用没有给它们一个值,您的初始化程序的其余部分(即什么也没有)也没有。

所以如果我说:let userModel = UserModel(),变量的值是多少?没有值,但它们不是可选的,因此必须有值。编译器指出了这个矛盾。

您不必继承 NSObject,除非有必要,否则您不应该继承。

  1. 你绝对必须总是继承自NSObject

class UserModel { ... } 也很好

  1. 错误的出现是因为当您尝试调用 super.init 时,必须正确设置 selfAndinit() 完成后你的 class 成员没有任何值!对于非可选类型,两者都不允许。

解决方案:删除 init() 甚至 NSObject 继承:

class UserModel {
    let _username : String
    let _password : String
    let _isAuthenticated : Bool
    let _isManager : Bool

    init(username : String = "", password : String = "", isAuthenticated : Bool = false, isManager : Bool = false) {
        self._username = username
        self._password = password
        self._isAuthenticated = isAuthenticated
        self._isManager = isManager
    }
}

旁注:为什么你的变量有一个前导下划线?