Swift学习45:扩展

张建 lol

前言

本篇将详细总结介绍Swift扩展的用法:

  • 扩展就是 为现有的类、结构体、枚举类型或者协议类型添加新功能

  • 扩展和 Objective-C 中的 category 类似,与 Objective-C 不同的是扩展 没有名字

extension 的能力

  • 可以添加 计算型实例属性计算型类型属性
  • 可以添加 实例方法和类型方法
  • 可以添加 新的初始化器
  • 可以添加 下标脚本
  • 可以使现有的 类型遵循某协议
  • 定义和使用 新内嵌类型
  • 扩展 可以向一个类型添加新的方法,但是不能重写已有的方法

使用注意:

  • 不可以添加 存储属性,也不可以为已有属性添加属性观察器
  • 扩展中不能为 添加 新的构造器,因为 新的构造器和结构器 必须由原始的类来实现

添加计算属性

  • 扩展 不可以添加存储型属性,也不可以为已有属性添加属性观察器
1
2
3
4
extension Double{
// 注意:扩展不能扩展存储型属性
// var km: Double = 0.0 //报错
}

  • 扩展可以添加新的计算型属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extension Double {
// 注意:扩展不能添加存储属性
// var km: Double = 0.0
// 计算属性
var km: Double { return self * 1_000.0}
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4
print("one inch is \(oneInch) meters")

=====
one inch is 25.4 meters

添加初始化器

  • 扩展能为 已有的类型添加新的初始化器

  • 扩展能为 类添加新的便捷初始化器,不能为类添加 指定初始化器或反初始化器,指定初始化器或反初始化器 必须由原来的类实现提供

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 origin_x = center.x - size.width/2
let origin_y = center.y - size.height/2
// 新的初始化器必须调用指定初始化器
self.init(origin:Point(x: origin_x, y: origin_y),size:size)
}
}

let rect3 = Rect(center: Point(x:200, y:200), size: Size(width: 100, height: 100))

添加方法

  • 扩展可以为 已有的类型 添加新的 实例方法和类方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 添加方法
extension Int {
// 实例方法
func repetions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}

3.repetions {
print("hello")
}

======
hello
hello
hello

添加异变方法

  • 通过 mutationg 关键字,可以 修改(或异变)实例方法本身

  • structenum 在修改self或本身属性时必须标记实例方法为 mutating

1
2
3
4
5
6
7
8
9
10
11
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
print(someInt)

=======
9

添加下标

  • 扩展可以为已有类型添加新下标脚本。

被除数 ➗ 除数 = 商 …. 余数
示例:获取 12345 的第 3 位数
推导过程:被除数 ➗ 10^位数次方 = 商(前面的几位数)… 余数(剩下的几位数),如 12345 ➗ 10^3 = 123 …. 45
被除数 ➗ 10 = 第 3 位数,123 ➗ 10 = 12 …. 3 余数是3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extension Int {
subscript(index: Int) -> Int {
var base = 1
for i in 0..<index {
base *= 10
}
return (self / base) % 10
}
}

print(746381295[0])
print(746381295[1])
print(746381295[2])

=============
5
9
2

添加内嵌类型

  • 扩展可以为已有的 类、结构体和枚举添加新的内嵌类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 添加内嵌类型
extension Int {
enum Kind {
// 负数 0 正数
case neg,zero,pos
}
var kind: Kind {
switch self {
case 0:
return .zero
case let x where x > 0:
return .pos
default:
return .neg
}
}
}
print(8.kind)
print(0.kind)

=======
pos
zero

通过扩展集合类型Collection给的元素添加限制

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 协议扩展添加约束条件
extension Collection where Element: Equatable {
func allEqual() -> Bool {
for element in self {
if element != self.first {
return false
}
}
return true
}
}

let equalNumbers = [100, 100, 100, 100, 100]
let differentNumbers = [100, 100, 200, 100, 200]

print(equalNumbers.allEqual())
print(differentNumbers.allEqual())

========
true
false
  • Post title:Swift学习45:扩展
  • Post author:张建
  • Create time:2023-03-05 17:05:03
  • Post link:https://redefine.ohevan.com/2023/03/05/Swift课程/Swift学习45:扩展/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.