1 1 下标的使用 2
3 1.1 问题 4
5 下标可以定义在类、结构体和枚举中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。 6
7 本案例定义一个Matrix结构体,用于呈现一个Double类型的二维矩阵,其结构体内部使用一个一维数组保存数据,并且定义一个下标用于判断是否会造成数组越界。 8
9 1.2 方案 10
11 首先定义一个Matrix结构体,该结构体有一个存储属性grid,是一个Double类型的结构体,用于存储矩阵的数据。 12
13 Matrix结构体另有两个整型的常量存储属性rows和columns,分别表示矩阵的行数和列数。通过init初始化方法对属性grid、rows以及columns赋初始值。 14
15 然后定义并实现下标运算,将传入的行号row和列号column转换为grid一维数组的下标,获取和设置对应的数据。 16
17 最后定义一个方法indexIsValidForRow,用于判断行号和列号是否越界,通过断言进行判断。 18
19 1.3 步骤 20
21 实现此案例需要按照如下步骤进行。 22
23 步骤一:定义Matrix结构体 24
25 首先定义一个Matrix结构体,该结构体有一个存储属性grid,是一个Double类型的结构体,用于存储矩阵的数据。 26
27 Matrix结构体另有两个整型的常量存储属性rows和columns,分别表示矩阵的行数和列数。通过init初始化方法对属性grid、rows以及columns赋初始值,代码如下所示: 28
29
30 struct Metrix { 31 //保存数据的一维数组
32 var grid : [Double] 33 //矩阵的行列
34 let rows : Int, columns : Int 35 //初始化方法
36 init(rows:Int, columns:Int){ 37 self.rows = rows 38 self.columns = columns 39 grid = [Double](count: rows*columns, repeatedValue: 0.0) 40 } 41 } 42 步骤二:实现下标运算 43
44 定义并实现下标运算,Marix的下标运算需要两个整型参数row和column,表示二维矩阵的下标,通过行号 row和列号column转换为grid一维数组的下标,获取和设置对应的数据,代码如下所示: 45
46
47 struct Metrix { 48 //保存数据的一维数组
49 var grid : [Double] 50 //矩阵的行列
51 let rows : Int, columns : Int 52 //初始化方法
53 init(rows:Int, columns:Int){ 54 self.rows = rows 55 self.columns = columns 56 grid = [Double](count: rows*columns, repeatedValue: 0.0) 57 } 58 subscript (row:Int,column:Int)->Double { 59 get { 60 return grid[row * columns + column] 61 } 62 set { 63 grid[row * columns + column] = newValue 64 } 65 } 66 } 67 步骤三:判断下标越界 68
69 在结构体中定义一个方法indexIsValidForRow,用于判断行号和列号是否越界,代码如下所示: 70
71
72 //判断下标越界
73 funcindexIsValidForRow (row:Int,column:Int)->Bool { 74 let index = row * columns + column 75 return row >= 0 && row <self.rows&& column >= 0 && column <self.columns 76 } 77 在下标运算中通过断言进行判断,代码如下所示: 78
79
80 subscript (row:Int,column:Int)->Double { 81 get { 82 assert(self.indexIsValidForRow(row, column: column), "下标越界") 83 return grid[row * columns + column] 84 } 85 set { 86 assert(self.indexIsValidForRow(row, column: column), "下标越界") 87 grid[row * columns + column] = newValue 88 } 89 } 90 然后创建一个Marix实例并进行赋值,运行结果如图-1所示: 91
92
93 图-1
94
95 1.4 完整代码 96
97 本案例中,完整代码如下所示: 98
99
100 importUIKit 101 struct Metrix { 102 //保存数据的一维数组
103 var grid : [Double] 104 //矩阵的行列
105 let rows : Int, columns : Int 106 //初始化方法
107 init(rows:Int, columns:Int){ 108 self.rows = rows 109 self.columns = columns 110 grid = [Double](count: rows*columns, repeatedValue: 0.0) 111 } 112 //判断下标越界
113 funcindexIsValidForRow (row:Int,column:Int)->Bool { 114 let index = row * columns + column 115 return row >= 0 && row <self.rows&& column >= 0 && column <self.columns 116 } 117 subscript (row:Int,column:Int)->Double { 118 get { 119 assert(self.indexIsValidForRow(row, column: column), "下标越界") 120 return grid[row * columns + column] 121 } 122 set { 123 assert(self.indexIsValidForRow(row, column: column), "下标越界") 124 grid[row * columns + column] = newValue 125 } 126 } 127 } 128 var m = Metrix(rows: 3, columns: 4) 129 m[0,0] = 100
130 m[0,1] = 200
131 m[0,2] = 300
132 m[0,3] = 400
133 //下标越界 134 //m[0,4] = 500
135 m[1,0] = 600
136 m[1,1] = 700
137 隐藏 138
139 2 构造过程 140
141 2.1 问题 142
143 构造过程是为了使用某个类、结构体或枚举类型的实例而进行的准备过程,这个过程包含了为实例中的每个属性设置初始值和为其执行必要