Skip to content

Swift 入门(18):协议进阶

协议(protocol)是 Swift 的核心特性之一。它不仅能定义行为接口,还能与扩展、泛型、面向协议编程结合,形成比继承更强大的抽象。

1. 协议继承

协议可以继承其他协议:

swift
protocol Named {
  var name: String { get }
}

protocol Aged {
  var age: Int { get }
}

protocol Person: Named, Aged {}

struct Student: Person {
  var name: String
  var age: Int
}

2. 协议中的构造器

协议可以要求实现某些构造器:

swift
protocol Initializable {
  init(value: Int)
}

class NumberBox: Initializable {
  var value: Int
  required init(value: Int) { // required 表示所有子类必须实现
      self.value = value
  }
}

3. 协议扩展(默认实现)

协议扩展可以提供默认实现,让协议更像“接口 + 实现”:

swift
protocol Drawable {
    func draw()
}

extension Drawable {
    func draw() {
        print("Default drawing...")
    }
}

struct Circle: Drawable {} // 没实现 draw(),会用默认实现

Circle().draw() // Default drawing...

也可以在扩展里添加新的方法:

swift
extension Drawable {
    func debug() {
        print("Debugging drawable object")
    }
}

Circle().debug() // Debugging drawable object

4. 协议与泛型

协议常与泛型结合,用 where 约束类型:

swift
protocol Summable {
    static func +(lhs: Self, rhs: Self) -> Self
}

func add<T: Summable>(_ a: T, _ b: T) -> T {
    return a + b
}

extension Int: Summable {}
extension Double: Summable {}

print(add(3, 5))      // 8
print(add(2.5, 7.1))  // 9.6

5. 面向协议编程(POP)

Swift 鼓励 Protocol-Oriented Programming(POP),比继承更灵活:

  • 协议定义能力(能做什么)。
  • 结构体/类采用协议,组合出需要的行为。
  • 协议扩展提供默认实现,减少重复代码。

示例:

swift
protocol Flyable {
    func fly()
}

extension Flyable {
    func fly() { print("Flying...") }
}

struct Bird: Flyable {}
struct Airplane: Flyable {}

Bird().fly()      // Flying...
Airplane().fly()  // Flying...

总结

  • 协议支持继承、构造器要求。
  • 协议扩展提供默认实现,提升代码复用。
  • 协议与泛型结合更强大。
  • 面向协议编程是 Swift 的核心思想。

本站总访问