【问题标题】:Swift: Working undefined functions in protocols?Swift:在协议中工作未定义的函数?
【发布时间】: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


【解决方案1】:

正如 Gerriet 所说,简短的回答是否定的。

如果您定义了机器人协议,但某些或大多数机器人不会实现哔声或哔哔声,那么您的协议实际上并没有那么有用。

不过你可以更具体一些...

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")
   }
}

【讨论】:

  • 你的LoudRobot 也需要实现explode,因为结构不支持继承
  • 好的,谢谢@Scriptable!但是,你会建议我对工厂做什么?该协议对此很有帮助,因为它可以轻松调用恰好是主要机器人的任何机器人的功能。有没有更好的方法来做到这一点?
  • 老实说,这取决于您打算如何使用它。所有的机器人都会发出哔哔声吗?如果不需要,您是否需要协议接口中所需的功能?工厂目前只创建一个测试机器人并在其上调用函数,您需要工厂做什么?你打算让很多机器人配置不同吗?老实说,我还没有快速使用工厂
  • @Scriptable 我使用的真正“工厂”是 GameScene,而真正的“机器人”是我在游戏中制作关卡的基础。没有一个级别会覆盖所有可用的功能,但所有功能都在某个时候被某个级别使用。这是一个棘手的情况。我找不到任何做这种事情的例子,所以我有点迷茫。
  • 如果不知道更多关于您将如何使用它,很难给出准确的答案。我建议从 WWDC developer.apple.com/videos/play/wwdc2015/408 观看此内容,它很好地了解了如何获得协议的好处并正确构建应用程序。你总是可以使用我上面提到的更具体的协议。那么您仍然可以拥有一组符合基本 Robot 协议的对象,然后当您需要更具体时,使用条件转换来查看您当前拥有哪种更具体的机器人
【解决方案2】:

怎么样:

   protocol Robot {
        //func beep()
        //func boop()
        //func explode()
   }

   extension Robot {
    func beep() {}
    func boop() {}
    func explode() {}
   }

   struct UselessRobot: Robot {
    init() {
        explode()
    }
    func explode() {
        print("BANG")
    }
   }

【讨论】:

  • 仍然在扩展中没有定义任何东西......这对我来说似乎是在浪费代码(尽管它并不多)
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多