一、建立 Protocol
- 方法只需要定义名称、参数、回传值。
- 描述该如何设计某个东西。
- 可能是描述某种特性或一些列相关的功能。
protocol Equatable {
static func == (lhs: Self, rhs: Self) -> Bool
}
二、添加属性
所有的属性都用 var 声明,只需要写名称、类型以及是否要能 get
和 set
。
protocol User {
var name: String { get set }
var birth: Date { get }
var age: Int { get }
// 可以提供预设值
var age: Int {
Date.now.year - birth.year
}
}
// 上方 Date.now.year 操作的扩展方法
extension Date {
var year: Int {
Calendar(identifier: .gregorian).dateComponents(in: .current, from: self).year!
}
}
三、Conform 其他 Protocol
protocol User: Equatable {
var name: String { get set }
var birth: Date { get }
var age: Int { get }
}
不可以使用 extension 来为 Protocol conform 其他 Protocol。
// ❌ 错误代码,Extension of protocol 'User' cannot have an inheritance clause
extension User: Equatable {}
四、泛型
protocol User {
// 泛型定义
associatedtype T: Hashable
var name: String { get set }
var birth: Date { get }
var password: T { get }
}
struct Consumer: User {
// 明确告诉 Swift 是什么具体类型,非必要。
// Swift 可以根据下面的 password 的实际类型推断,
// 大部分时候 typealias 只是为了让 xcode 自动生成相关方法和属性。
typealias T = String
var name: String
var birth: Date
var password: String
}