【发布时间】:2025-12-18 19:40:01
【问题描述】:
我一直在使用 Swift 协议,我试图弄清楚为什么这段代码不起作用...
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 不符合协议AnimalHouse。如果您跟进,它会告诉您myAnimal 需要Animal 类型,而我提供Bird 类型。显然,Bird 确实符合 Animal 协议,但这还不足以让编译器满意。
我假设这是单行修复之一,其中诀窍是知道单行在哪里。有人有什么建议吗?
(而且,是的,我可以将myAnimal 设为Animal,然后在函数稍后将其转换为Bird,但这似乎不必要地混乱。)
【问题讨论】:
-
相信可以在这里找到答案:*.com/questions/25419529/…。不幸的是,它并不是那么优雅。当然,您键入的内容应该得到编译器的支持。
-
@Robert:不,编译器不应该支持它。编译器是对的。请看我的回答。