的准备和初始化任务。本案例分别演示值类型的构造过程和类的构造过程。 144
145 2.2 方案 146
147 类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值,可以在在构造方法中为存储属性赋初始值,也可以在定义属性时为其设置默认值。构造方法以关键字init命名,最简单的形式是一个不带任何参数的实例方法。 148
149 在定义构造方法时也能提供参数,为构造过程中提供所需要的数据。 150
151 如果在定义构造方法时没有提供参数的外部名称,Swift会为每个构造方法的参数自动生成一个跟内部名称相同的外部名。 152
153 Swift为所有属性已提供默认值的且自身没有定义任何构造方法的结构体或基类提供一个默认的构造方法,这个构造方法没有任何参数,并且将简单的创建一个所有属性都设置为默认值的实例。 154
155 构造方法可以通过其他构造方法来完成实例的部分构造过程成为构造委托,它能减少多个构造方法间的代码重复。构造委托的实现在值类型和类类型中有所不同,值类型不支持继承构造委托的过程相对简单。 156
157 由于类可以继承,所以类类型的构造委托需要保证其所有继承的存储型属性在构造时也能正确的初始化。 158
159 2.3 步骤 160
161 实现此案例需要按照如下步骤进行。 162
163 步骤一:存储型属性的初始值 164
165 定义一个用来保存华氏温度的结构体Fahrenheit,拥有一个Double类型的存储属性temperature,通过构造方法给该属性赋初始值,代码如下所示: 166
167
168 struct Fahrenheit { 169 var temperature : Double 170 init(){ 171 temperature = 32.0
172 } 173 } 174 创建一个Fahrenheit实例,构造方法会自动被调用,运行结果如图-2所示: 175
176
177 图-2
178
179 步骤二:带参数的构造方法 180
181 定义一个包含摄氏度的结构体,包含两个不同的构造方法init(fromFahrenheit)和init(fromKelvin),分别通过接受不同的温度值来创建新的实例,代码如下所示: 182
183
184 struct Celsius { 185 vartemperatureInCelsius:Double = 0.0
186 init(fromFahrenheitfahrenheit:Double) { 187 temperatureInCelsius = (fahrenheit - 32.0)/1.8
188 } 189 init (fromKevinkelvin:Double) { 190 temperatureInCelsius = kelvin - 273.15
191 } 192 } 193 创建一个Celsius实例,如果不传参会调用构造方法init(),但是由于没有该方法则会编译报错,运行结果如图-3所示: 194
195
196 图-3
197
198 步骤三:构造方法的内部参数名和外部参数名 199
200 如果在定义构造方法时没有提供参数的外部名称,Swift会为每个构造方法的参数自动生成一个跟内部名称相同的外部名。 201
202 定义一个结构体Color,包含三个Double类型的常量属性red、green、blue,分别表示红绿蓝的颜色数值。 203
204 Color结构体提供一个构造方法,包含三个Double类型的构造参数,代码如下所示: 205
206
207 struct Color { 208 let red, green, blue : Double 209 init(red:Double, green:Double, blue:Double){ 210 self.red = red 211 self.green = green 212 self.blue = blue 213 } 214 } 215 创建一个Color实例时需要通过三种颜色的外部参数名来传值,如果不通过外部参数名字传值是无法调用该构造方法的,运行结果如图-4所示: 216
217
218 图-4
219
220 当然也可以使用下划线来忽略外部参数名,代码如下所示: 221
222
223 struct Color { 224 let red, green, blue : Double 225 init(red:Double, green:Double, blue:Double){ 226 self.red = red 227 self.green = green 228 self.blue = blue 229 } 230 init(_ red:Double, _ green:Double, _ blue:Double){ 231 self.red = red 232 self.green = green 233 self.blue = blue 234 } 235 } 236 在创建Color实例时不通过外部参数名字传值将调用第二个构造方法,运行结果如图-5所示: 237
238
239 图-5
240
241 步骤四:默认构造方法 242
243 Swift为所有属性已提供默认值的且自身没有定义任何构造方法的结构体或基类提供一个默认的构造方法。 244
245 定义一个类ShoppingListItem,封装了购物清单中的相关信息:名字name、数量quantity和购物状态purchased. 246
247 如果不为该类定义任何构造方法,它将自动获得一个可以为所有属性设置默认值的默认构造方法,对于可选类型的属性name将设置为nil,代码如下所示: 248
249
250 classShoppingListItem { 251 varname:String?
252 var quantity = 1
253 var purchased = false
254 } 255 var s = ShoppingListItem() 256 运行结果如图-6所示: 257
258
259 图-6
260
261 如果是结构体,还可以自动获得一个逐一成员构造方法,该方法是用来初始化结构体新实例属性的快捷方法。 262
263 在调用逐一成员构造方法时通过与成员名相同的参数名进行传值来完成成员属性的初始化,代码如下所示: 264
265
266 struct Size { 267 var width = 0.0
268 var height = 0.0
269 } 270 var size = Size(width: 10, height: 20) 271 运行结果如图-7所示: 272
273
274 图-7
275
276 步骤五:值类型的构造委托 277
278 对于值类型而言可以使用self.init在自定义的构造方法中引用其它的属于相同值类型的构造方法,并且只能在构造方法内部调用self.init。 279
280 定义一个结构体Rect用来代表几何矩形,包含一个Point类型的属性origin和一个Size类型的属性size,代码如下所示: 281
282
283 struct Point { 284 var x = 0.0
285 var y = 0.0
286 } 287 struct Size { 288 var width = 0.0
289 var height = 0.0
290 } 291 structRect { 292 var origin = Point() 293 var siz |