【问题标题】:Object inherit from NSObject causes error Property 'self._username' not initialized at super.init call从 NSObject 继承的对象导致错误属性“self._username”未在 super.init 调用中初始化
【发布时间】:2016-10-01 07:02:54
【问题描述】:

我创建了继承自 NSObject 的 UserModel 对象,由于“在 super.init 调用时未初始化属性 'self._username'”,我遇到了覆盖 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 inheritance superclass


    【解决方案1】:

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

    let _username: String?
    

    let _username: String = ""
    

    【讨论】:

      【解决方案2】:

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

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

      你不必从 NSObject 继承,除非你有理由需要,否则你不应该这样做。

      【讨论】:

        【解决方案3】:
        1. 您绝对必须始终从NSObject 继承!

        class UserModel { ... } 也很好

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

        解决方案:删除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
            }
        }
        

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

        【讨论】:

        • 这只是我们在商店中使用的编码约定。我们使用 C++ 编码约定
        猜你喜欢
        • 2015-07-05
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2014-07-24
        相关资源
        最近更新 更多