Loading...
Published 2022-03-23

Protocols - 协议

协议没看懂~

协议规定了用来实现某一特定功能所必需的方法和属性。 任意能够满足协议要求的类型被称为遵循(conform)这个协议。 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。

创建协议

protocol Identifiable {
    // 协议定义
    var id: String { get }
}

如果一个类型遵循协议,那么它必须提供协议中定义的所有要求。

struct User: Identifiable {
    var id: String
}

协议继承

协议之间可以继承,这样可以让遵循协议的类型拥有父协议中的属性和方法。

protocol Payable {
    func calculateWages() -> Int
}

protocol NeedsTraining {
    func study()
}

protocol HasVacation {
    func takeVacation(days: Int)
}

# 继承

protocol Payable: Payable, NeedsTraining, HasVacation {
    // 协议继承
}

扩展

extension允许向现有的类型添加方法,属性或者下标。类似于 js 的prototype

extension Int {
    func squared() -> Int {
        return self * self
    }
}

let number = 8
number.squared() // 64

不允许在扩展中添加存储属性

extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
}

协议扩展

let pythons = ["Eric", "Graham", "John", "Michael", "Terry", "Terry"]
let beatles = Set(["John", "Paul", "George", "Ringo"])

Swift 的数组和集合都属于Collection,所以可以写个扩展来满足协议要求。

extension Collection {
    func summarize() {
        print("There are \(count) of us:")

        for name in self {
            print(name)
        }
    }
}

pythyon.summarize()
beatles.summarize()

总结

  • 协议描述了一致类型必须具有的方法和属性,但不提供这些方法的实现。
  • 您可以在其他协议之上构建协议,类似于类。
  • 扩展允许您将方法和计算属性添加到特定类型,例如 Int.
  • 协议扩展允许您向协议添加方法和计算属性。
  • 面向协议的编程是将您的应用程序架构设计为一系列协议,然后使用协议扩展来提供默认方法实现的实践