1).初始构造方法
构造方法必须有能力将所有的存储属性进行初始化
class Point {
var x = 0 //属性有初始值
// init ( ) {
//
// }
}
let _ = Point( )
当对象中所有的存储属性都有初始值的时候,我们可以不提供init初始方法,系统会默认提供上面注掉的init方法 -- 带有缺省值的隐式构造方法
2).带有参数的构造方法
class Point {
var x = 0 //属性有初始值
init ( x : Int) {
self.x = x
}
}
let _ = Point.init(x : 10)
//也可以写为
let _ = Point(x : 10)
构造方法的内部参数,系统也会默认作为外部参数。
3).常量存储属性与构造方法
常量存储属性只能在初始构造方法中修改,其他任何时候都不可以修改
class Point {
let x : Int
init ( x : Int) {
self.x = x
}
}
let _ = Point(x : 10)
4).可选属性与构造方法
struct MyRect {
var center : Double?
var size : (Double , Double)
init (){
size = (10,10)
//没有对可选值 center属性初始化
}
}
let _ = MyRect()
由上面可以看出,可选值属性,在初始化构造方法中,可以不进行初始化。
(可选值属性一般也不在初始化方法中进行初始化)
5).结构体的构造方法
struct MyRect {
var center : Double?
var size : (Double , Double)
}
let _ = MyRect(center: 10, size: 10)
swift规定,对于存储属性,要么必须有缺省值,要么必须在初始化方法的时候,对存储属性赋予初值。
但是在在上面的结构体中,我们都没有做到,也没有报错,是因为:
swift,对于结构体,可以默认提供一个结构体注意成员构造器(前面提过)。
但是如果你自定义了一个初始构造方法,那么结构体逐一成员构造器就会失效。
6).值类型的构造器代理
直观一点就是“构造方法之间的相互调用”
构造方法可以调用次结构体中的其他构造方法来完成示例的构造,称为之构造器代理。
好处:减少构造方法之间的代码重复
struct MyRect {
var x : Double
var y : Double
init (x: Double , y : Double) {
self.x = x
self.y = y
}
init(){
self.init(x : 10 , y : 10)
}
}
7).闭包或者全局函数来设置存储属性的缺省值
如果需要做大量运算才能确定一个属性的缺省值的时候,我们就可以采用闭包或者全局函数来设置存储属性的缺省值。
func getValue () -> Int {
return 11
}
class MyRect {
//使用闭包赋初值
var x : Int = { // 等于号说明这是个赋值语句
10 //简写版本
// () -> Int in //完整版本
//
// return 10
}()
//如果不加括号,则只是个闭包声明,加了后,说明是执行闭包
//使用全局函数赋初值
var z : Int = getValue()
}