协议扩展

extension

  • 扩展为现有的类、结构体、枚举类型、协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能力(所谓的逆向建模)。
  • 扩展和 OC 中的 category 类似(不同之处在于:Swift 的扩展没有名字)。

extension 的能力

  • 添加计算实例属性和计算类型属性;【不能添加存储属性】
  • 定义实例方法和类型方法;
  • 提供新初始化器;
  • 定义下标;
  • 定义和使用新内嵌类型;
  • 使现有的类型遵循某协议;
  • 扩展可以向一个类型添加新的方法,但是不能重写已有的方法。【OC 中的 category 可以覆盖掉已有的方法】

计算属性

  • 扩展可以向已有的类型添加计算实例属性和计算类型属性。

初始化器

  • 扩展可以向已有的类型添加新的初始化器,这允许你扩展其他类型以使初始化器接收你的自定义类型作为形式参数,或提供该类型的原始实现中未包含的额外初始化选项。
  • 扩展能为类型添加新的便捷初始化器,但是不能为类型加指定初始化器。指定初始化器和反初始化器 必须由原来类的实现提供。
struct Size {
    var width = 0.0, height = 0.0
}

struct Point {
    var x = 0.0, y = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()
}

extension Rect {
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}

let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))

方法

  • 扩展可以为已有的类型添加新的实例方法和类型方法。
extension Int {
    func repetitions(task:() -> Void) {
        for _ in 0..<self {
            task()
        }
    }
}

3.repetitions {
    print("hello")
}

执行结果如下:
hello
hello
hello

mutating 方法

  • 扩展的实例方法仍可以修改(或异变)实例本身。结构体和枚举类型方法在修改 self 或本身的属性时必须标记实例方法为 mutating,和原本是险恶异变方法一样。
extension Int {
    mutating func square() {
        self = self * self
    }
}

var someInt = 3
someInt.square()
print("\(someInt)")

执行结果如下:
9

下标

  • 扩展能为已有的类型添加新的下标
extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        
        print("\((self / decimalBase) % 10)")
        return (self / decimalBase) % 10
    }
}
746381295[0]
746381295[1]
746381295[2]
746381295[8]

执行结果如下:
5
9
2
7

添加内嵌类型

  • 扩展可以为已有的类、结构体和枚举类型添加新的内嵌类型
extension Int {
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0:
            return .zero
        case let x where x > 0 :
            return .positive
        default:
            return .negative
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容