gpt4 book ai didi

ios - Swift 协议(protocol)和多态性

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:50 25 4
gpt4 key购买 nike

我一直在努力让这段代码工作

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()
}
}

但是编译器告诉我Player不符合Shooter协议(protocol)。我认为这是因为 Player 武器变量是 Gun 类型,而不是 Shootable,即使 Gun 实现了 Shootable。

但后来我改变了它,现在它可以工作了:

protocol Shooter
{
typealias Weapon:Shootable
var weapon:Weapon { get set }
}

我不知道为什么。我以为 typealiases 只是给一个类型起另一个名字,我不知道这种能力......

任何人都可以阐明这一点吗?

最佳答案

AFAIK typealiasprotocol 声明中类似于声明 generic 类型。在声明中使用协议(protocol)类型就是声明您将仅将其用于协议(protocol)声明的内容。

如果您这样写,您的第一个示例将起作用:

class Player:Shooter
{
var weapon:Shootable

init ()
{
weapon = Gun()
/* weapon.someOtherMethod()
Can't use it 'cause weapon is strictly a Shootable, thus it is not meant to have any other methods than shoot()
*/
}
}

您的第二个示例有效,因为您在协议(protocol)中声明了一个通用 类型并要求它是一个符合Shootable 的类型。您的修改使用了类型推断,因此您的第二个示例的以下重写可能会更清楚:

class Player:Shooter
{
typealias Weapon = Gun
var weapon:Weapon

init ()
{
weapon = Gun()
weapon.someOtherMethod()
}
}

这里我明确声明 generic 协议(protocol)类型别名 WeaponGun(因为它符合 Shootable 一切正常)。在您的示例中,这是由编译器隐式推断的,因为没有歧义。

关于ios - Swift 协议(protocol)和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29140191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com