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

时间:2016-06-01 18:54:23

标签: swift inheritance superclass

我创建了从NSObject继承的UserModel对象我有覆盖init()的问题,因为"属性' self._username'没有在super.init call"初始化。谁有人告诉我如何解决它?我也应该总是继承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()
    }


}

3 个答案:

答案 0 :(得分:2)

  1. 您绝对必须 必须始终从NSObject继承!
  2. class UserModel { ... }完全没问题

    1. 出现错误是因为当您尝试拨打super.init self时,必须正确设置。完成init()您的班级成员没有任何价值!两者都不允许使用非可选类型。
    2. 解决方案:删除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
          }
      }
      

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

答案 1 :(得分:0)

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

let _username: String?

let _username: String = ""

答案 2 :(得分:0)

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

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

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