2015-07-15 4 views
0

Я не могу понять, почему 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, он работает, но это приемлемый способ справиться с этим?

ответ

0

Я думаю, это происходит потому, что класс BaseSpaceship не имеет инициализаторов и var currentMissile: BaseMissile! не может быть ниль. Таким образом, вы либо должны сделать это по желанию, заменив! с ? или присвоить значение по умолчанию.

+0

Хорошо, я изменил 'var currentMissile: BaseMissile!' На 'var currentMissile: BaseMissile?', Но теперь, когда я делаю 'spacehip.currentMissile.shoot()' Мне нужно написать 'spacehip.currentMissile? .shoot()' Не существует способа не всегда писать «?» –

+1

да, назначить значение по умолчанию в BaseSpaceship, поэтому компилятор знает, что у вас 100% есть ракета. Вы можете сделать это либо в методе init, либо inline в классе. – s1ddok

+0

изменение 'var currentMissile: BaseMissile?' To 'var currentMissile = BaseMissile()' вызывает тот же самый сбой, что и раньше –

Смежные вопросы