Swift基础知识之扩展

一、扩展(Extension)

  • Swift中的扩展类似于OC中的类别(category)
  • 扩展可以为枚举、结构体、类、协议扩展新功能
  • 可以添加方法、计算属性、下标、便捷初始化器、协议等等
扩展不能办到的事情
  1. 不能覆盖原有的功能
  2. 不能添加存储属性
  3. 不能向已有的属性添加属性观察器
  4. 不能添加父类
  5. 不能添加指定初始化器
  6. 不能添加反初始化器

二、计算属性、方法、下标、嵌套类型

extension Int {
    // 方法
    func repetitions(task: () -> Void) {
        for _ in 0.. Int {
        self = self * self
        return self
    }
    // 嵌套类型
    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
        }
    }
    // 下标
    subscript(digitIndex: Int) -> IntegerLiteralType {
        var decimalBase = 1
        for _ in 0..

三、扩展中添加初始化器

  • 如果自定义初始化器的同时,也希望编译器生成默认初始化器
    • 可以在扩展中添加初始化器
    • required的初始化器也不能写在扩展中
struct Point {
    var x: Int = 0
    var y: Int = 0
}

extension Point {
    init(_ point: Point) {
        self.init(x: point.x, y: point.y)
    }
}

var p1 = Point()
var p2 = Point(x: 10)
var p3 = Point(y: 20)
var p4 = Point(x:10, y: 20)
var p5 = Point(p4)

四、扩展为协议添加方法

  • 若果一个类已经实现了协议的所有要求,但是声明它遵守该协议
    • 可以通过扩展遵守协议
protocol TestProtocol {
    func test()
}

class TestClass {
    func test() {
        print("test")
    }
}
extension TestClass : TestProtocol { }

五、扩展为协议提供默认实现

  • 可以通过默认实现,实现可选协议的效果
  • 扩展可以为协议扩充【协议中从未声明的方法】
protocol TestProtocol {
    func test()
}

extension TestProtocol {
    func test() {
        print("testprotocol 123")
    }
    // 该方法相当于可选方法
    func test2() {
        print("protocol 456")
    }
}

class TestClass : TestProtocol {
    func test2() {
        print("TestClass impletement")
    }
}

var cls = TestClass()
cls.test()
cls.test2()

do {
    // 如果是遵循协议的类、
    // 如果协议中添加了默认扩展方法、会优先调用
    let cls: TestProtocol = TestClass()
    cls.test()
    cls.test2()
}
  • 扩展可以使用原有类中的泛型类型
class Stack {
    var elements = [E]()
    func size() -> Int { elements.count }
}

// 扩展依然可以使用原类型中的泛型类型
extension Stack {
    func top() -> E { elements.last! }
}

// 符合条件才扩展
extension Stack: Equatable where E : Equatable {
    static func == (left: Stack, right: Stack) -> Bool {
        left.elements == right.elements
    }
}

至此、swift扩展内容应基本囊括其中,有不足之处还请各位大佬不吝赐教,不胜感激!!!

你可能感兴趣的:(Swift基础知识之扩展)