初始化
类,结构和枚举当 Swift 声明后准备初始化类实例。初始值被初始化为存储属性,并且新的实例的值也被进一步进行初始化。创建初始化函数的关键字是通过 init() 方法。Swift 初始化不同于 Objective-C,它不返回任何值。其作用是检查新创建的实例的其处理前初始化。Swift 还提供了“反初始化”过程中执行的内存管理操作当实例被释放。
对于存储的属性初始化器的作用
存储的属性处理实例之前初始化类和结构的实例。 存储属性使用初始分配和初始化值,从而消除了需要调用属性观察者。 初始化用于存储属性:
创建初始值
要在属性定义中指定默认属性值
为特定的数据类型,初始化实例 init()方法被使用,init()函数没有传递参数。
语法
init()
{
//New Instance initialization goes here
}
</div>
示例
struct rectangle {
var length: Double
var breadth: Double
init() {
length = 6
breadth = 12
}
}
var area = rectangle()
println("area of rectangle is \(area.length*area.breadth)")
</div>
当我们使用 playground 运行上面的程序,得到以下结果。
area of rectangle is 72.0</div>
这里结构 'rectangle' 使用成员长宽高为 “double” 的数据类型进行初始化。init()方法被用于为新创建的成员的长度和初始化double 类型的数值。 计算长方形的面积,并通过调用矩形函数返回。
通过默认设置属性值
Swift 语言提供 init()函数来初始化存储的属性值。此外,用户必须规定默认在声明类或结构的成员初始化属性值。当属性的值在整个程序中时一样时,我们可以在声明部分单独声明它,而不是在 init()中初始化。默认情况下,用户设置属性值时能够继承被定义为类或结构。
struct rectangle {
var length = 6
var breadth = 12
}
var area = rectangle()
println("area of rectangle is \(area.length*area.breadth)")
</div>
当我们使用 playground 运行上面的程序,得到以下结果。
area of rectangle is 72.0</div>
在这里,代替声明长和宽在 init()中,在声明本身时就初始化值了。
参数初始化
在 Swfit 语言用户提供以初始化参数初始化,使用定义作为 init()的一部分。
struct Rectangle {
var length: Double
var breadth: Double
var area: Double
init(fromLength length: Double, fromBreadth breadth: Double) {
self.length = length
self.breadth = breadth
area = length * breadth
}
init(fromLeng leng: Double, fromBread bread: Double) {
self.length = leng
self.breadth = bread
area = leng * bread
}
}
let ar = Rectangle(fromLength: 6, fromBreadth: 12)
println("area is: \(ar.area)")
let are = Rectangle(fromLeng: 36, fromBread: 12)
println("area is: \(are.area)")
</div>
当我们使用 playground 运行上面的程序,得到以下结果。
area is: 72.0 area is: 432.0</div>
局部及外部参数
初始化参数具有类似于的函数和方法参数局部和全局参数名称。局部参数声明用于初始化体,外部参数声明访问用于调用初始化。Swift 函数初始化和方法不同,它们不识别哪些初始化用于该函数调用。
为了克服这个问题,Swift 引入了一个自动外部名称为 init()的每个参数。 这种自动外部名称是等同的每一个初始化参数局部名字之前写入。
struct Days {
let sunday, monday, tuesday: Int
init(sunday: Int, monday: Int, tuesday: Int) {
self.sunday = sunday
self.monday = monday
self.tuesday = tuesday
}
init(daysofaweek: Int) {
sunday = daysofaweek
monday = daysofaweek
tuesday = daysofaweek
}
}
let week = Days(sunday: 1, monday: 2, tuesday: 3)
println("Days of a Week is: \(week.sunday)")
println("Days of a Week is: \(week.monday)")
println("Days of a Week is: \(week.tuesday)")
let weekdays = Days(daysofaweek: 4)
println("Days of a Week is: \(weekdays.sunday)")
println("Days of a Week is: \(weekdays.monday)")
println("Days of a Week is: \(weekdays.tuesday)")
</div>
当我们使用 playground 运行上面的程序,得到以下结果。
Days of a Week is: 1 Days of a Week is: 2 Days of a Week is: 3 Days of a Week is: 4 Days of a Week is: 4 Days of a Week is: 4</div>
不带外部名称参数
当外部名称不需要一个初始化下划线“_”,这是用来覆盖默认行为。
struct Rectangle {
var length: Double
init(frombreadth breadth: Double) {
length = breadth * 10
}
init(frombre bre: Double) {
length = bre * 30
}
init(_ area: Double) {
length = area
}
}
let rectarea = Rectangle(180.0)
println("area is: \(rectarea.length)")
let rearea = Rectangle(370.0)
println("area is: \(rearea.length)")
let recarea = Rectangle(110.0)
println("area is: \(recarea.length)")
</div>
当我们使用 playground 运行上面的程序,得到以下结果。