美文网首页
协议扩展

协议扩展

作者: 一个栗 | 来源:发表于2021-12-28 13:13 被阅读0次

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
        }
    }
}

相关文章

  • swift 4.0 协议 协议扩展

    协议 协议扩展

  • swift 扩展和协议的结合

    协议和扩展是可以结合使用的,可以通过扩展使已有的类型采纳某个协议,也可以对现有协议进行扩展。 一、通过扩展采纳协议...

  • POP-面向协议编程

    什么是面向协议编程? 面向协议 = 协议 + 扩展 + 继承通过协议、扩展做功能划分,降低模块间的耦合,增强代码的...

  • swift中protocol的extension中使用#sele

    协议扩展 不能在上面这样的协议扩展中直接使用#selector,协议扩展对于OC是看不见的。 其中有个报错: @o...

  • Swift 命名空间形式扩展的理解和问题探讨

    先从 Swift 协议扩展的语法说起 注:协议扩展 Protocol extension: Swift 1.x 中...

  • 扩展,协议

    扩展 扩展类似oc里面的category,用来为已存在的类提供额外功能。 extension可以访问类的所有成员,...

  • 协议扩展

    协议扩展 在Swift 1.0 时代,协议(Protocol)基本上类似一个接口,定义若干属性和方法,供类、结构体...

  • 协议扩展

    extension 扩展为现有的类、结构体、枚举类型、协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能...

  • Swift 语言简单介绍(二)

    本片文字主要介绍: 结构体 类 协议 扩展 闭包 结构体 类 协议 扩展 枚举 闭包

  • swift 协议的可选方法

    在协议中定义方法 扩展协议,在扩展协议中给出默认实现 如果代理实现了此方法,会覆盖默认实现 public prot...

网友评论

      本文标题:协议扩展

      本文链接:https://www.haomeiwen.com/subject/gmribltx.html