【发布时间】:2017-05-09 10:27:53
【问题描述】:
我有这样的协议:
protocol Robot {
func beep()
func boop()
func explode()
}
还有这样的结构:
struct Factory {
let robot: Robot
func testRobot() {
robot.beep()
robot.boop()
}
func killRobot() {
robot.explode()
}
}
它们都可以正常工作(至少在理论上),并且应该适用于任何使用 Robot 协议的东西。
但是,如果我有这样的结构:
struct UselessRobot: Robot {
init() {
explode()
}
func explode() {
print("BANG")
}
}
然后 XCode 不会编译它,因为我没有定义 beep 或 boop。但是,如果我仍然定义它们,这些函数将是空的:
extension Robot {
func beep() {}
func boop() {}
func explode() {}
}
有没有办法解决这个问题?编写什么都不做的代码行似乎很奇怪。
工厂接受任何机器人,所以更容易调用哔哔声而不用担心它们是否工作,所以我宁愿避免做一些复杂的检查。
感谢您的帮助!
EDIT: This question is the same as this one here, sorry everyone
【问题讨论】:
-
简短回答:不。更长的答案:协议旨在轻量级并且不包含实现。这样,您可以确定 UselessRobot 的所有实现实际上都是结构的一部分,并且不必搜索可能包含其他实现的协议 Robot。
func beep() {}行包含信息 - 它告诉您对于 UselessRobot 哔声将无济于事。 -
协议只是函数的定义。不是实现。我们必须只在类/结构中实现它们并编写我们自己的逻辑。
标签: ios swift struct protocols