作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在研究 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 anAnimal!
inside themyAnimal
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/
我是一名优秀的程序员,十分优秀!