Swift 协议与扩展
xxxixxxx

协议 Protocol

使用 Protocol 关键字创建一个协议

让遵守该协议的 class 与 struct 实现约定一些方法与属性。

1
2
3
4
5
6
7
8
9
10
11
protocol PageNumberProtocol {
/// 添加的实例属性
var pageNumber: Int { get set }
/// 添加的实例方法
func add()

/// 添加的类属性
static var name: String? { get set }
/// 添加的类方法
static func logName()
}

遵守协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct Person: PageNumberProtocol {
var pageNumber: Int

func add() {}

static var name: String?

static func logName() {}
}

class Car: PageNumberProtocol {
var pageNumber: Int = 0

func add() {}

static var name: String?

static func logName() {}
}

扩展 extension

扩展使用的很多应该都很熟悉

分散代码实现

1
2
3
4
5
6
extension Car {
func dididi() {
print("滴滴滴")
}
}

使用

1
Car().dididi()

Protocl + Extension

给出协议并实现协议,这样遵守协议的 class 和 struct 就能直接使用协议方法。

runtime 添加属性

1
2
3
4
5
6
7
func getAssociatedObject<T>(_ object: Any, _ key: UnsafeRawPointer) -> T? {
return objc_getAssociatedObject(object, key) as? T
}

func setRetainedAssociatedObject<T>(_ object: Any, _ key: UnsafeRawPointer, _ value: T) {
objc_setAssociatedObject(object, key, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

协议

1
2
3
4
5
6
7
8
9
10
11
12

protocol PageNumberProtocol {
/// 添加的实例属性
var pageNumber: Int { get set }
/// 添加的实例方法
func add()

/// 添加的类属性
static var name: String? { get set }
/// 添加的类方法
static func logName()
}

扩展遵守协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

private var pageNumberKey: Void?

private var nameKey: Void?

extension UIViewController: PageNumberProtocol {
static func logName() {
debugPrint(name ?? "无名")
}

static var name: String? {
get {
getAssociatedObject(self, &nameKey)
}
set {
setRetainedAssociatedObject(self, &nameKey, newValue)
}
}

func add() {
pageNumber += 1
}

var pageNumber: Int {
get {
getAssociatedObject(self, &pageNumberKey) ?? 0
}
set {
setRetainedAssociatedObject(self, &pageNumberKey, newValue)
}
}
}

这样所有遵守 PageNumberProtocol 协议的 UIViewController 就都有了协议要求的属性与方法且已经实现了。

  • Post title:Swift 协议与扩展
  • Post author:xxxixxxx
  • Create time:2020-12-25 17:15:00
  • Post link:https://xxxixxx.github.io/2020/12/25/100-Swift协议与扩展/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments