返回

Swift 中的 Protocol 和 Opaque Types

IOS

协议:行为蓝图

协议在 Swift 中充当接口,为特定任务或功能定义了一组方法、属性和其他要求。类、结构体和枚举遵循协议,并实现其指定的接口。这类似于 Java 中的接口或 C# 中的抽象类。

定义协议

protocol 定义一个协议:

protocol MyProtocol {
  var name: String { get }
  func doSomething()
}

协议只声明方法和属性的签名,而不会提供实现。遵循协议的类型必须提供这些成员的实现。

不透明类型:隐藏实现细节

不透明类型允许我们定义具有特定行为的类型,同时隐藏其底层实现细节。这通过使用 @objc 关键字实现,如下所示:

@objc protocol MyOpaqueProtocol {
  var name: String { get }
  func doSomething()
}

与普通协议不同,不透明协议的实现细节对外部代码不可见。这有助于封装和模块化,防止意外更改或滥用。

实现不透明类型

遵循不透明协议的类型必须提供实现,但实现细节对外部代码是隐藏的:

class MyOpaqueType: MyOpaqueProtocol {
  private var _name: String

  var name: String {
    get { return _name }
  }

  func doSomething() {
    // ...
  }
}

协议和不透明类型的应用

协议和不透明类型在 Swift 开发中广泛应用,尤其是在以下场景:

  • 可扩展性: 允许不同类型遵循同一协议,从而实现多态行为。
  • 模块化: 促进代码组织和维护,通过将接口和实现分开。
  • 可测试性: 支持模拟和存根,使单元测试更加容易。
  • Objective-C 互操作性: 通过 @objc 协议实现与 Objective-C 代码的互操作性。

结论

协议和不透明类型是 Swift 中强大的工具,它们提供了一种定义接口和隐藏实现细节的方法。通过遵循这些原则,开发人员可以创建可扩展、模块化且可测试的代码,同时保持代码的清晰性和可维护性。