构造器用于完成实例的构造过程,这个过程包括为实例中的每个存储属性设置初始值和执行必要的准备和初始化任务
与oc的构造器不同,swift的构造器构造出来的实例由系统隐式返回,无须显式声明返回值类型,也无须使用return返回实例,也不允许使用func关键字
构造器的主要作用就是完成实例中每个类,结构体中实例存储属性的初始化
为实例存储属性赋初始值有两个时机:
定义实例存储属性时指定初始值
在构造器中为实例存储属性指定初始值
/* 在结构体中 假设存在有实例存储属性 如果没有给属性直接赋值,则需要在构造器中赋值,如果没有自己写构造器,可以使用系统提供的给所有属性赋值的构造器 如果已经给属性直接赋值,可以使用系统提供的无参构造器 另外,一旦自己写了构造器,那个系统的给所有属性赋值的构造器就不能用了 */ struct FkPoint { var left : Int var top : Int = 0 init(left: Int)//构造器中的参数全都有默认外部参数名,如果不想要外部参数名可以使用下划线代替 { self.left = left } } var p12 = FkPoint(left: 20) /* 使用闭包或函数为属性设置初始值 如果某个存储属性的默认值需要特别的计算或定制,此时程序可通过闭包或全局函数(不能通过调用实例方法)为该属性指定初始值 */ struct ClosureInit { var test : Int = { return 3; }()//这里的括号不能省,不然就是把闭包赋值给test属性 } var ci = ClosureInit() print(ci.test) //使用闭包或函数对存储属性赋初始值时,不能在闭包中访问该结构体或类的其他实例存储属性(即使它们有初始值),不能使用self,也不能调用其他实例方法--这是因为闭包本身会在构造阶段执行,此时该实例的其他部分还未完成初始化 /* 值类型的构造器重载 形参个数不同,或形参类型不同,或外部形参名不同都算是构造器重载 可以在构造器中使用self调用另一个构造器 */ struct Apple { var name:String var color:String var weight:Double!//这里的double类型是可选类型,所以可以不在构造器中赋值 init(_ name:String, _ color:String) { self.name = name self.color = color } init(name:String, color:String){ self.init(name,color) } init(appleName n:String, appleColor c:String){ // name = "" 这里不可以这样写,必须用self来调用 self.init(n,c) } init(name:String, color:String, weight:Double){ self.init(name,color) self.weight = weight; } } /* 可能失败的构造器 使用init?或init!来声明可能失败的构造器,可以返回nil */ struct Cat { let name : String init?(name:String){ if name.isEmpty{ return nil } self.name = name } } let c1 = Cat(name: "kitty") if c1 != nil{ print(c1!.name) } let c2 = Cat(name: "") print(c2 == nil) enum Season2{ case Spring, Summer, Autumn, Winter init!(name:Character){ switch name{ case "S","s": self = .Spring case "U","u": self = .Summer case "W","w": self = .Winter default: return nil } } } let s1 = Season2(name: "s"); if s1 != nil{ print("season succees") } let s2 = Season2(name: "x") print(s2 == nil)