扬庆の博客

Swift- 泛型(1)

字数统计: 564阅读时长: 2 min
2021/03/19 Share

泛型

基本概念

iOS 里泛型是 Swift 引入进来的, 可让你根据自定义的需求, 编写出适用于任意类型可复用的函数以及类型。

作用

避免写重复代码, 而是用一种清晰抽象的方式来表达代码意图。

解决的问题

例如: 任意两个相同类型的值,交换他俩的值。

Code

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import UIKit

var str = "Hello, playground"

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}

var numb1 = 100
var numb2 = 200

print("交换前数据: \(numb1)\(numb2)")
swapTwoInts(&numb1, &numb2)
print("交换后数据: \(numb1)\(numb2)")

// 结果
// 交换前数据: 100 和 200
// 交换后数据: 200 和 100

func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}

// 交换两个字符串
var str1 = "1111"
var str2 = "2222"
print("交换前数据: \(str1)\(str2)")
swapTwoStrings(&str1, &str2)
print("交换后数据: \(str1)\(str2)")

// 总结: 方法类似, 只是类型不一样而已


/*
* 引出了泛型:
1. 利用<占位类型名> 代替 <实际类型名>
*/

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}

var num1 = 100
var num2 = 200
print("交换前数据: \(num1)\(num2)")
swapTwoValues(&num1, &num2)
print("交换后数据: \(num1)\(num2)")

/*
这个尖括号<> , 告诉 Swift T 是 swapTwoValues(_:_:)
函数定义内的一个占位类型名,
因此 Swift 不会去查找名为 T 的实际类型.
*/


var string1 = "AAAA"
var string2 = "BBBB"
print("交换前字符串: \(string1)\(string2)")
swapTwoValues(&string1, &string2)
print("交换后字符串: \(string1)\(string2)")

// 运行结果:
// 交换前字符串: AAAA 和 BBBB
// 交换后字符串: BBBB 和 AAAA



/* 速记: 告诉 Swift T 是占位类型名, 所以 Swift 不会去查找 T 的实际类型.*/

泛型格式

1
func funcName<T>(para: T) { } 

类型名:T

占位符类型名, 而不是 String Int Double这种实际类型。 占位类型用来笼统代表这些实际类型名。

类型名T的作用

表示告诉Swift,我是泛型类型名,不是实际类型名,Swift就不会去查找T实际的类型名,不会导致语法报错。

参考SwiftGG

参考RUNOOB

CATALOG
  1. 1. 泛型
    1. 1.0.1. 基本概念
    2. 1.0.2. 作用
    3. 1.0.3. 解决的问题
    4. 1.0.4. 泛型格式
      1. 1.0.4.1. 类型名:T
      2. 1.0.4.2. 类型名T的作用