标签:构造器
结构体和类在创建实例的过程中需要进行一些初始化的工作,这个过程称为构造过程。相反,在这些实例最后被释放的时候需要进行一些资源清除的工作,这个过程称为析构过程。
结构体和类的实例在构造的过程中会调用一种特殊方法,称为构造器,构造器init没有返回值,可以重载,在多个构造器重载的情况下,运行环境可以根据它的外部参数或参数列表调用合适的构造器。类似的方法在Object-C中称为构造方法,在C++中称为构造函数,Object-C中的构造方法有返回值,而C++中的构造函数名必须与类名相同,没有返回值。
一、默认构造器
结构体和类在构造过程中都会调用一个构造器,即便是没有编写任何的构造器,也存在一个默认的构造器
1、类默认构造器
class Rectangle{ var width:Double = 0.00 var height:Double = 0.00 } var rect = Rectangle() rect.width = 320.00 rect.height = 350.00
事实上,在Rectangle的定义过程中省略了构造器,相当于如下代码
class Rectangle{ var width:Double = 0.00 var height:Double = 0.00 init(){ self.width = 10.0 self.height = 20.0 } } var rect = Rectangle() rect.width = 320.00 rect.height = 350.00
2、结构体默认构造器
struct Rectangle { var width:Double = 0.00 var height:Double = 0.00 }
而结构体Rectangle的默认构造器与类Rectangle的构造器是不同的,相当于如下代码:
struct Rectangle { var width:Double = 0.00 var height:Double = 0.00 init(){} //无参默认构造器 } var rect = Rectangle(width: 10,height:20) //结构体默认的有参数的构造器
二、构造器与存储属性初始化
1、初始化存储属性
构造器的主要作用就是初始化存储属性,在init()构造器中初始化存储属性width和height后,那么在定义它们时就不需要初始化了;
class Rectangle{ var width:Double = 0.00 var height:Double = 0.00 init(){ width = 10.0 height = 20.0 } }
如果存储属性在构造器中没有初始化,在定义的时候也没有初始化,那么在编译的时候会出错;
2、初始化常量存储属性
class Employee{ let no:Int = 0 var name:String? var salary:Double var dept:Department? init(){ no = 0 //不能在普通方法中赋值 salary = 0.0 }
struct Department{ let no:Int var name:String init(){ no = 10 //不能在普通方法中赋值 name = "SALES" } }
存储属性一般在定义的时候初始化,如果不能确定初始值,可以采用可选类型属性,或者也可以在构造器中初始化。
三、使用外部参数名
1、外部参数名
为了增强程序的可读性,Swift的方法和函数可以使用外部参数名,在构造器中也可以使用外部参数名,构造器中的外部参数名要比一般的方法和和函数更有意义,由于构造器命名都是init,如果一个对象类型中有多个构造器,我们就可以通过不同的外部的参数名区分不同的构造函数
class Rectangle{ var width:Double = 0.00 var height:Double = 0.00 init(W width:Double,H height:Double){ self.width=width self.height = height } var rect = Rectangle(W:320,H:480) }
2、简化外部参数名
外部参数名可以简化,在函数中可以在参数前加#,使得局部参数名变成外部参数名,但在构造器中就不用这么麻烦,构造器中的局部参数名可以直接作为外部参数名使用:
本文出自 “平凡之路” 博客,请务必保留此出处http://linjohn.blog.51cto.com/1026193/1622588
标签:构造器
原文地址:http://linjohn.blog.51cto.com/1026193/1622588