我一直试图让这个代码工作斯威夫特协议和多态性
protocol Shootable
{
func shoot()
}
protocol Shooter
{
var weapon:Shootable { get set }
}
class Gun:Shootable
{
func shoot() {
}
func someOtherMethod()
{
}
}
class Player:Shooter
{
var weapon:Gun
init()
{
weapon = Gun()
weapon.someOtherMethod()
}
}
但是,编译器告诉我,球员不符合射手协议。我认为这是因为玩家武器变种是Gun类型的,不可射击,即使Gun实现Shootable。
但后来我改变了这一点,现在,它的工作原理:
protocol Shooter
{
typealias Weapon:Shootable
var weapon:Weapon { get set }
}
而且我不知道为什么。我以为typealiases只是给一个类型另一个名字,我并不知道这种能力...
任何人都可以对此有所了解吗?
如果您在播放器类中声明武器为可在协议中进行拍摄,并将init中包含someOtherMethod()的行更改为(武器为枪).someOtherMethod(),它将起作用。虽然,我没有解释为什么它可以用于typealias。 – 2015-03-19 10:02:45
我知道,但我不想这样做,使其工作。 – Odrakir 2015-03-19 10:16:49