gpt4 book ai didi

Swift 协议(protocol) : Why does the compiler complain that my class doesn't conform to a protocol?

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:09 26 4
gpt4 key购买 nike

我一直在研究 Swift 协议(protocol),我想弄清楚为什么这段代码不起作用...

protocol Animal {
var name: String {get}
var breed: String {get}
}

struct Bird: Animal {
var name: String
var breed: String
var wingspan: Double
}

protocol AnimalHouse {
var myAnimal: Animal! {get set}
}

class Birdhouse: AnimalHouse {
var myAnimal: Bird!

func isOpeningBigEnough() -> Bool {
return myAnimal.wingspan <= 5.0
}
}

编译器一直给我的问题是 BirdHouse 不符合协议(protocol) AnimalHouse。如果您跟进,它会告诉您 myAnimal 需要类型 Animal,而我提供类型 Bird。显然,Bird 确实符合 Animal 协议(protocol),但这还不足以让编译器满意。

我假设这是那些单行修复程序之一,其中的诀窍是知道一行代码在哪里。有人有什么建议吗?

(而且,是的,我可以将 myAnimal 设为 Animal,然后在函数的后面将其转换为 Bird,但这似乎不必要的困惑。)

最佳答案

编译器是对的。

当你写作时

protocol AnimalHouse {
var myAnimal: Animal! {get set}
}

您正在做出(除其他外)以下声明:

If a type does conform to AnimalHouse, then it is possible to put an Animal! inside the myAnimal property.

现在让我们看看Birdhouse是如何定义的

class Birdhouse: AnimalHouse {
var myAnimal: Bird!

...
}

myAnimal 上的类型是Bird!。并且您不能将 Animal! 放入 Bird! 类型的属性中。

因此 Birdhouse 遵守 AnimalHouse 协议(protocol)中的 promise 。

关于Swift 协议(protocol) : Why does the compiler complain that my class doesn't conform to a protocol?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33795715/

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