Я новичок в Swift. Я делаю упражнение в разработке приложений с помощью swift. Последовательные инициализаторы класса и ссылка.

Я не знаю, как решить проблему. Вопрос в том, чтобы написать собственный инициализатор, не предоставляя значения по умолчанию для всего.

class Spaceship {
    let name: String
    var health: Int = 100
    var position: Int = 0

    func moveLeft() {
        position -= 1
    }

    func moveRight() {
        position += 1
    }

    func wasHit() {
        health -= 5
    }

    init(name:String, health:Int, position:Int) {
        self.name = name
        self.health = health
        self.position = position
    }
}

class Fighter: Spaceship {
    let weapon: String
    var remainingFirePower: Int

    init(weapon:String,remainingFirePower:Int) {
        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.")
        }
    }
}

class ShieldedShip: Fighter {
    var shieldStrength: Int

    override func wasHit() {
        if shieldStrength > 0 {
            shieldStrength -= 5
        } else {
            super.wasHit()
        }
    }
    init(shieldStrength:Int, weapon:String, remainingFirePower:Int){
        self.shieldStrength = shieldStrength
        super.init(weapon:weapon, remainingFirePower:remainingFirePower)
    }
}
0
sam 27 Июн 2017 в 13:59
ТАК - ужасное место для отладки вашей небольшой программы. ericlippert.com/2014/03/05/how-to -debug-small-programs Какие шаги вы предприняли, чтобы решить эту проблему самостоятельно?
 – 
user1531971
27 Июн 2017 в 18:30
Программа отлично работает, когда я придаю значения имени, здоровью и должности. Мне интересно, есть ли другие методы решения программы, кроме этого. Поскольку вопрос в том, чтобы написать свой собственный инициализатор, не предоставляя значений по умолчанию для всего.
 – 
sam
28 Июн 2017 в 05:30
Если он работает идеально, то у вас есть способ начать выяснять, где он перестает работать идеально. Работайте от известного к неизвестному, проверяя свои утверждения по ходу дела.
 – 
user1531971
28 Июн 2017 в 17:54

2 ответа

Прочтите о типах optional. Ты можешь написать:

let name: String?
var health: Int?
var position: Int?

Ссылка на дополнительные типы

0
Vlad Pulichev 27 Июн 2017 в 14:01
Я сомневаюсь, что это то, о чем на самом деле спрашивал ОП. Ошибка возникает в этой строке: super.init(name: name, health: health, position: position). Следовательно, следует внести уточнения в вопрос
 – 
Mr. Xcoder
27 Июн 2017 в 15:02

Вот идентификатор, что ты хочешь

init(name:String = "ship", health:Int = 100, position:Int = 0) {
    self.name = name
    self.health = health
    self.position = position
}

По сути, вы хотите установить такое значение по умолчанию, и если вы просто хотите инициализировать его со значениями по умолчанию, не передавайте НИЧЕГО в эту функцию, например

super.init()
0
Fangming 27 Июн 2017 в 15:20
Итак, мне нужно сначала указать значение этим параметрам в разделе инициализации, по крайней мере? Я не понимаю, что означает вопрос, написав свой собственный инициализатор
 – 
sam
28 Июн 2017 в 05:31
Да. Если вы хотите иметь значение по умолчанию для метода инициализации вашего класса Spaceship, вы должны сделать это там, как я. А затем, когда вы вызываете этот метод инициализации, вы можете либо передать данные, чтобы переопределить значение по умолчанию, либо просто не вводить данные для использования значений по умолчанию.
 – 
Fangming
28 Июн 2017 в 05:33