Я не могу понять, почему Xcode площадка разваливается, вот моя основная установкаНаследование класса, который соответствует протоколу
protocol Shootable {
func shoot()
}
class BaseMissile: Shootable {
var damage = 0
func shoot() {
println("Pew pew for \(damage) damage")
}
}
class Missile1: BaseMissile {
override init() {
super.init()
damage = 1
}
}
protocol Targetable {
var life: Int {get set}
}
class BaseSpaceship: Targetable {
var life = 0
var currentMissile: BaseMissile!
func printHealth() {
println("My current life: \(life)")
}
}
class Spaceship1: BaseSpaceship {
override init() {
super.init()
life = 1
currentMissile = Missile1()
}
}
var spaceship = Spaceship1()
spaceship.printHealth()
spaceship.currentMissile.shoot()
конкретно последняя линия spaceship.currentMissile.shot()
падает на игровой площадке. Если я переведу var currentMissile: BaseMissile!
от BaseSpaceship
до Spaceship1
, он работает, но это приемлемый способ справиться с этим?
Хорошо, я изменил 'var currentMissile: BaseMissile!' На 'var currentMissile: BaseMissile?', Но теперь, когда я делаю 'spacehip.currentMissile.shoot()' Мне нужно написать 'spacehip.currentMissile? .shoot()' Не существует способа не всегда писать «?» –
да, назначить значение по умолчанию в BaseSpaceship, поэтому компилятор знает, что у вас 100% есть ракета. Вы можете сделать это либо в методе init, либо inline в классе. – s1ddok
изменение 'var currentMissile: BaseMissile?' To 'var currentMissile = BaseMissile()' вызывает тот же самый сбой, что и раньше –