类的构造和析构

2018-12-17  本文已影响0人  架构师的一小步

默认构造函数

class TV{
var working=false
func open(){
 self.working=true
}
func close(){
self.working=false
}
}

let tv=TV()

自定义构造函数

//用户初始化函数不需要传参的
class TV{
var working:Bool
func open(){
 self.working=true
}
func close(){
self.working=false
}
init(){
 working=false
}
}

let tv=TV()

//需要穿参数的
class TV{
var model:String
var working:Bool
func open(){
 self.working=true
}
func close(){
self.working=false
}
//这里设置参数,证明用户初始化函数,需要传递一个参数
init(model:String){
 working=false
//这里用self.model访问的属性model,是为了区别model,如果不加self访问的会是这个参数model,证明他们两个不是同一个值
self.model=model
}
}

let tv=TV(model:"一个新的开始")

继承和构造

//父类
class TV{
 var model:String
init(model:String){
 self.model=model
}
init(){
 self.model="old-man"
}
}
let tv=TV(model:"old-man")

//子类
class GameTV:TV{
 func playGame() -> Void{
print("start play game...")
}
//如果想要自己的初始化值需要重载init函数,和之前重载方式一样用override关键字进行重载定义
override init(){
 super.init()
self.model="game-tv1"
}
}

继承类的构造函数


//基类
class TV{
 var model:String

init(model:String){
  self.model=model
}
}

//报错写法
class GameTV:TV{
 var playingGame:Bool
init(){
// self.playingGame=false要放到super.init之前
 super.init(model:"lcd")
 self.playingGame=false
}
}

//
//正确写法
class GameTV:TV{
 var playingGame:Bool
init(){
 self.playingGame=false
 super.init(model:"lcd")
}
}

Tow phase

1.阶段1,初始化所有的属性
2.阶段2,初始化所有方法


Phase 1:

Phase 2:

class Country{
    let name: String
    //这里加问号,表示City是optional,有值或者为空,因为phase 1阶段需要初始化所有属性,
    //所以city不加的话,就相当于没有完成第一阶段,所以不加就会报错,但是可以在确定有值得情况下,把?变成!
    var capitalCity: City?
    init(name: String,capitalName:String)
    {
        self.name=name
        self.capitalCity=City(name: capitalName, country: self)
    }
}

class City{
    let name:String
    unowned var country:Country
    init(name:String,country:Country) {
        self.name=name
        self.country=country
    }
}

Designated Initializer:构造函数

Convenience Initializer

convenience Initializer里面不能初始化自身的属性的,只能调用Designated Initializer

Failable Initializer:构造函数有可能失败

Class TV{
 var model:String
//在这里需要将init变成optional类型,否则系统报错,需要明确这个返回类型。
init?(model:String){
 if model.isEmpty{
 return nil
}
self.model=model
}
}

//继承有可能为空的函数
//这里一定不会返回为空,
class SafeTV:TV{
  override init(model:String){
  if model.isEmpty{
//这里叹号表示不会运行失败,失败的话跑出运行时的异常,在编译的时候是可以通过的
  super.init(model:"old-man")!
}
else{
  super.init(model:model)!
}
}
}
image.png
上一篇下一篇

猜你喜欢

热点阅读