ios - Swift:在协议(protocol)中使用未定义的函数?

标签 ios swift struct protocols

我有一个这样的协议(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/

相关文章:

ios - 使用 FCM 推送通知在 ios ionic 中不起作用

C -- 结构体和指针基础题

ios - Swift:防止在井字游戏中双击?

objective-c - 导入头文件

ios - View 层次结构错误 - 试图在新 Storyboard中打开新 View Controller

swift - 为什么我必须按住 tableview 中的单元格才能打开它?

c - union 内部的结构

c - 错误: expected specifier-qualifier-list before when creating a struct array

ios - 如何设置不同的 UITableViewCell 样式?

ios - 在 UICollectionView 中创建 2 x 2 水平网格?