swift - 你能在 Swift 的子类中选择继承什么吗?

标签 swift inheritance initialization subclassing

我有一个基类 (Spaceship),它有一些变量和一个初始值设定项。 我还有一个子类 (UFO),它只需要父类(super class)的一个变量。 当我尝试创建一个基本的 UFO 对象时,我得到:“在调用 var c = UFO() 时缺少参数‘weapon’的参数” 我意识到错误消息要求武器参数,但我如何(甚至可能吗?)创建不需要武器参数的基本 UFO 对象?

花了几个小时修改“override”、“init”和“super”命令。我在 SO 和其他网站上阅读了很多文章,但没有看到任何与我的情况类似的例子。同样,我假设我想做的事情是可能的。

class Spaceship {

    var isUFO = false  
    var weapon:String 

     init(weapon:String) {      
         self.weapon = weapon
     }

    func printSomething() {
     print("Test")
    }
}

class UFO: Spaceship {
}


var a = Spaceship(weapon:"Laser")
a.printSomething() //OUTPUT: Test

var b = UFO(weapon:"")  
          //This runs, but I don't want to have to fill in parameters
b.printSomething()    //OUTPUT: Test

var c = UFO()       //Ultimately this is what I want to do
c.printSomething()  
       //OUTPUT: missing argument for parameter 'weapon' in call var c =    UFO()

最佳答案

你可以做的是将weapon标记为optional String。此外,在 init(weapon:) 中使用 weapon默认值 作为 nil ,即

class Spaceship {
    var isUFO = false
    var weapon: String? //here...

    init(weapon: String? = nil) { //here...
        self.weapon = weapon
    }

    func printSomething() {
        print("Test")
    }
}

现在,您可以简单地创建带有和不带有weapon类UFO 的对象,即

var a = Spaceship(weapon:"Laser")
var b = UFO(weapon:"Another Weapon")
var c = UFO()  

关于swift - 你能在 Swift 的子类中选择继承什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57055849/

相关文章:

C++ list<T>::iterator 不能在派生类模板中使用

c++ - C++中常量数组的初始化

c++ - 难以理解的POD默认初始化

ios - 如何将变量放入文本字​​段以及如何将所有元素转换为字符串而不仅仅是一次 1?

java - Java中如何从父类(super class)调用子类方法?

ios - Mozharovsky 的 CVCalendar 日期不显示

c++ - 扩展 GEOS 类

c++ - 如何防止默认初始化具有类类型的 const 变量

ios - Swift 泛型和向上转型

json - Swift 解码 json 错误 : keyNotFound