为什么我们需要NoOp类型?

时间:2020-08-28 10:41:04

标签: ios swift design-patterns optional api-design

注意:这不是一个仅限Swift的问题,它与Optional类型的每种语言都有关系。

我看到一些Swift项目正在这样做:var foo: Foo = NoOpFoo() AFAIK这基本上意味着“此foo不执行任何操作”,也可以表示为var foo: Foo? = nil

我想知道NoOp而不是Optional决策背后的原因是什么?

  1. 我可以首先考虑性能:Optional似乎在汇编输出中增加了几行(但是我对此并不十分信服)。
  2. 原因也可能是解开了可选参数的样板:但是我见过的大多数示例都是不返回值的类型,因此调用站点也不需要解开。
  3. 也可能有历史原因,例如,在Java中处理NullPointerException会很棘手,因此NoOp可能会派上用场...但是在Swift中?

Here is an example from swift-log project

public struct Logger {
    var handler: LogHandler
    internal init(_ handler: LogHandler) {
        self.handler = handler
    }
}
public struct SwiftLogNoOpLogHandler: LogHandler { ... }

Logger旨在与LogHandler一起使用;据我了解,如果您将NoOpHandler传递给Logger,那么您应该将yourLogger: Logger变成myLogger: Logger? = nil

真实的用例和/或您的个人经验将不胜感激!

1 个答案:

答案 0 :(得分:0)