Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 4-无法调用';宇宙飞船。初始';毫无争议_Ios_Swift - Fatal编程技术网

Ios Swift 4-无法调用';宇宙飞船。初始';毫无争议

Ios Swift 4-无法调用';宇宙飞船。初始';毫无争议,ios,swift,Ios,Swift,这是我的密码。我已经在这上面呆了一段时间了。我只是想不通。我遵循的指南希望我在Fighter子类中使用super.init(),但每次尝试时它似乎都会给我一个错误 class Spaceship { var name = String() var health = Int() var position = Int() init(name: String) { self.name = name } init(health: Int)

这是我的密码。我已经在这上面呆了一段时间了。我只是想不通。我遵循的指南希望我在Fighter子类中使用super.init(),但每次尝试时它似乎都会给我一个错误

class Spaceship {
    var name = String()
    var health = Int()
    var position = Int()
    init(name: String) {
        self.name = name
    }
    init(health: Int) {
        self.health = health
    }
    init(position: Int) {
        self.position = position
    }
    func moveLeft() {
        position -= 1
    }
    func moveRight() {
        position += 1
    }
    func wasHit() {
        health -= 5
    }
}


您没有将类中的所有实例变量设置为传递值的初始值设定项。除非有特定的有效默认值,否则每个值都有一个单独的
init
。我建议您阅读并可能修改代码,在
Spaceship
中使用
init(名称:health:position:)
初始值设定项,在
Fighter
中使用
init(名称:health:position:武器:remainingFirePower:)
初始值设定项调用super的实现并传递值

如果存在任何您永远不希望为空字符串或零的值,则不应为它们提供默认值,因此在初始值设定项中需要它们

这相当于将代码修改为具有指定的初始值设定项,该初始值设定项设置所有内容并具有默认值

class Spaceship {
    var name : String
    var health : Int
    var position : Int
    init(name: String = "", health: Int = 0, position: Int = 0) {
        self.name = name
        self.health = health
        self.position = position
    }
    func moveLeft() {
        position -= 1
    }
    func moveRight() {
        position += 1
    }
    func wasHit() {
        health -= 5
    }
}

class Fighter: Spaceship {
    let weapon: String
    var remainingFirePower: Int
    init(name: String = "", health: Int = 0, position: Int = 0, weapon: String = "", remainingFirePower: Int = 0) {
        self.weapon = weapon
        self.remainingFirePower = remainingFirePower
        super.init(name: name, health: health, position: position)
    }

    func fire() {
        if remainingFirePower > 0 {
            remainingFirePower -= 1
        } else {
            print("You have no more fire power.")
        }
    }
}

太空船的所有初始值设定项都有一个参数。您必须调用一个初始值设定项并传递它所需的参数,或者向
SpaceShip
添加一个不带参数的初始值设定项。因此,我尝试对其他2个进行super.init(名称:“”)和类似操作。它仍然不起作用。显然,我不允许有多个super.init声明。我还试图用逗号划出第一个想法,但也没用。你能给我举个例子吗?
剩余火力
init(武器…
)中没有初始值,你还需要加上它非常感谢你,瓦卡瓦马!(我刚刚也发现了,Tj3n,谢谢你)天哪!这太有道理了!谢谢你!
class Spaceship {
    var name : String
    var health : Int
    var position : Int
    init(name: String = "", health: Int = 0, position: Int = 0) {
        self.name = name
        self.health = health
        self.position = position
    }
    func moveLeft() {
        position -= 1
    }
    func moveRight() {
        position += 1
    }
    func wasHit() {
        health -= 5
    }
}

class Fighter: Spaceship {
    let weapon: String
    var remainingFirePower: Int
    init(name: String = "", health: Int = 0, position: Int = 0, weapon: String = "", remainingFirePower: Int = 0) {
        self.weapon = weapon
        self.remainingFirePower = remainingFirePower
        super.init(name: name, health: health, position: position)
    }

    func fire() {
        if remainingFirePower > 0 {
            remainingFirePower -= 1
        } else {
            print("You have no more fire power.")
        }
    }
}