初始化 – Swift子类化 – 如何覆盖Init()

我有以下类,用init方法
class user {
  var name:String
  var address:String

  init(nm: String,ad: String) {
    name = nm
    address = ad
  }
}

我试图子类这个类,但我不断收到的错误super.init()部分:

class registeredUser : user {
     var numberPriorVisits: Int

     // This is where things start to go wrong - as soon as I type 'init' it 
     // wants to autocomplete it for me with all of the superclass' arguments,// and I'm not sure if those should go in there or not:
     init(nm: String,ad: String) {  
        // And here I get errors:
        super.init(nm: String,ad: String) 

     // etc....

苹果的iBook有子类化的例子,但没有一个特性类有一个init()方法与任何实际参数。所有的初始化都没有参数。

那么,你怎么做呢?

除了Chuck的答案,你还必须在调用super.init之前初始化你的新引入的属性

A designated initializer must ensure that all of the properties
introduced by its class are initialized before it delegates up to a
superclass initializer. (The Swift Programming Language -> Language Guide -> Initialization)

因此,使它工作:

init(nm: String,ad: String) {
    numberPriorVisits = 0  
    super.init(nm: nm,ad: ad) 
}

这个简单的初始化为零可以通过将属性认值设置为零来完成。也鼓励这样做:

var numberPriorVisits: Int = 0

如果你不想要这样的认值,那么扩展你的初始化器也为新的属性设置一个新的值是有意义的:

init(name: String,ads: String,numberPriorVisits: Int) {
    self.numberPriorVisits = numberPriorVisits
    super.init(nm: name,ad: ads)
}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...