Appearance
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 object4. 协议与泛型
协议常与泛型结合,用 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.65. 面向协议编程(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 的核心思想。