在Swift语言学习中,协议与扩展是实现代码复用、增强代码灵活性的重要特性。它们让代码更具模块化与可维护性,在实际开发里作用显著。
协议:定义行为契约,实现多态复用
协议定义了属性和方法的蓝图,但不包含具体实现,任何类型只要满足协议要求,就能被视为遵循该协议。这为代码复用提供了强大支持。
比如在一个图形绘制项目里,定义Shape协议,包含计算面积和绘制的方法:
protocol Shape {
var area: Double { get }
func draw()
}
然后让Circle和Rectangle结构体遵循Shape协议:
struct Circle: Shape {
let radius: Double
var area: Double {
return Double.pi * radius * radius
}
func draw() {
print("绘制半径为\(radius)的圆")
}
}
struct Rectangle: Shape {
let width: Double
let height: Double
var area: Double {
return width * height
}
func draw() {
print("绘制宽为\(width),高为\(height)的矩形")
}
}
通过协议,可将不同类型的形状统一处理,实现代码复用。例如定义一个绘制函数,接受Shape类型参数:
func drawShapes(_ shapes: [Shape]) {
for shape in shapes {
shape.draw()
}
}
let shapes: [Shape] = [Circle(radius: 5), Rectangle(width: 4, height: 6)]
drawShapes(shapes)
这样,添加新的形状类型时,只要遵循Shape协议,就能直接使用drawShapes函数,无需修改函数代码。
扩展:拓展已有类型,减少重复代码
扩展能为已有类型添加新功能,无需继承或修改原始类型代码,是实现代码复用的另一利器。
比如为Int类型扩展一个计算阶乘的方法:
extension Int {
func factorial() -> Int {
var result = 1
for i in 1...self {
result *= i
}
return result
}
}
let num = 5
print("\(num)的阶乘是\(num.factorial())")
在iOS开发中,常为UIView扩展便捷方法。例如为UIView添加设置圆角的扩展:
extension UIView {
func setCornerRadius(_ radius: CGFloat) {
layer.cornerRadius = radius
layer.masksToBounds = true
}
}
let view = UIView()
view.setCornerRadius(10)
通过扩展,可将通用功能集中管理,一处定义,多处使用,极大减少重复代码,提升开发效率。
Swift的协议与扩展从不同角度实现代码复用。协议通过行为抽象,让不同类型统一协作;扩展为已有类型注入新能力,避免重复开发。掌握并运用好它们,能编写出更简洁、灵活、可维护的Swift代码 。