面向协议编程

背景介绍

  • 苹果在2015年和2016年连续两年的WWDC上都提倡面向协议编程

  • Object-C是纯面向对象的语言;Swift是面向对象(兼容Object-C)、面向协议、函数式、值类型等多种范式都兼容的语言。

  • Swift推荐用值类型,用struct,用面向协议的方式

  • 协议相当于C++的虚基类,可以多继承,类,结构体、枚举都可以用,比基类好。

  • 系统的照样用类,一级继承系统API,加final关键字,防止多级继承

  • 鼓励多用struct + 协议的方式,值类型,线程安全

  • 将协议、扩展、泛型三块结合起来用

关键点

  • Self Requiremen,在protocol引用自己,用大写的Self

  • 在具体的实现类中,不用as

  • 在用protocol作为类型的场合,用泛型。

protocol Ordered { 
    func precedes(other: Self) -> Bool
}
class Number : Ordered { 
    var value: Double = 0 
    func precedes(other: Number) -> Bool { 
        return value < other.value   // 这里other就不需要as到Number
    }
}
func binarySearch(sortedKeys: [T], forKey k: T) -> Int { 
    var lo = 0 
    var hi = sortedKeys.count 
    while hi > lo { 
        let mid = lo + (hi - lo) / 2 
        if sortedKeys[mid].precedes(k) { 
            lo = mid + 1
        } else { 
            hi = mid 
        } 
     }
     return lo
}
  • 使用协议扩展,提供协议的默认实现。这个作用有点类似Object-C中的protocol可选函数。

  • 一般使用,只要不涉及到protocol引用自身,就不需要引入泛型。用protocol作为接口和虚基类,能很好地解耦。扩展协议提供默认实现这个特性,推荐使用。在定义协议的时候紧接着就提供相应的默认值,特别是属性。

参考文章

  • Session 408: Protocol-Oriented Programming in Swift

  • Protocol and Value Oriented Programming in UIKit Apps

  • Swift面向协议编程初探

  • 记Protocol Oriented Programming in Swift of WWDC 2015

  • 不要用子类!Swift的核心是面向协议

  • Swift面向协议编程

你可能感兴趣的:(面向协议编程)