我有一个这样的协议(protocol):
protocol Robot {
func beep()
func boop()
func explode()
}
像这样的结构:
struct Factory {
let robot: Robot
func testRobot() {
robot.beep()
robot.boop()
}
func killRobot() {
robot.explode()
}
}
它们都工作得很好(至少理论上),并且应该适用于任何使用 Robot 协议(protocol)的东西。
但是,如果我有这样的结构:
struct UselessRobot: Robot {
init() {
explode()
}
func explode() {
print("BANG")
}
}
那么 XCode 将不会编译它,因为我没有定义 beep 或 boop。但是,如果我无论如何定义它们,这些函数将是空的:
extension Robot {
func beep() {}
func boop() {}
func explode() {}
}
有办法解决这个问题吗?编写几行不执行任何操作的代码似乎很奇怪。
工厂接受任何机器人,因此更容易调用 beep 和 boop 而不用担心它们是否工作,所以如果可能的话,我宁愿避免进行一些复杂的检查。
感谢您的帮助!
EDIT: This question is the same as this one here, sorry everyone
最佳答案
正如 Gerriet 所说,简短的答案是否定的。
如果您定义了机器人协议(protocol),但某些或大多数机器人不会实现蜂鸣声或嘘声,那么您的协议(protocol)实际上并没有那么有用。
你可以更具体一点...
protocol Robot {
func explode()
}
protocol NoisyRobot: Robot {
func beep()
func boop()
}
struct QuietRobot: Robot {
func explode() {
print("bang")
}
}
struct LoudRobot: NoisyRobot {
func explode() {
print("bang")
}
func beep() {
print("beep")
}
func boop() {
print("boop")
}
}
关于ios - Swift:在协议(protocol)中使用未定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43867344/