Swift

19.Swift学习之构造函数与析构函数

2018-10-21  本文已影响213人  YungFan

重要说明

构造函数的介绍

默认构造函数

class Person {
    var name:String
    var age:Int
    var sex:String
    //1.构造函数没有func修饰
    //2.构造函数默认完成调用 不能手动调用
    init() {      
        print("被调用")
        name = "Zhangsan"
        age = 10
        sex = "male"
    }
}
var p = Person()
p.age
p.name
p.sex
自定义构造函数
//定义类
class Person {
    var name:String
    var age:Int
    var sex:String
    //默认构造函数
    init() {

        print("被调用")
        name = "Zhangsan"
        age = 10
        sex = "male"
    } 
    //自定义构造函数
    init(name:String, age:Int, sex:String) {        
        self.name = name
        self.age = age
        self.sex = sex   
    }
}
var p = Person()
p.age
p.name
p.sex

var p2 = Person(name: "Wangli", age: 11, sex: "female")
p2.age
p2.name
p2.sex

结构体类型的成员构造函数

//定义了一个名为 Size 有两个属性分别是 width 和 height 的结构体,这两个属性通过分配默认值 0.0 ,从而被推断为 Double 类型
struct Size {
    var width = 0.0, height = 0.0
}
//Size 结构体自动接收一个 init(width:heght:) 构造函数
let twoByTwo = Size(width: 2.0, height: 2.0)

值类型的构造函数委托

struct Size {
    var width = 0.0, height = 0.0
    init() {    
        //构造函数委托
        self.init(width: 2.0, height: 2.0)
    }
    init(width:Double, height:Double) {
        self.width = width
        self.height = height
    }
}
//要么不要写任何构造函数,要么全写所有的构造函数,否则下面第二种调用方式会有问题,参考上面第四条
var size = Size()
size.width
size.height
var size2 = Size(width: 1.2, height: 1.2)
size2.width
size2.height

类的继承和初始化

//类的指定构造函数
init(parameters) {
    statements
}
//便捷构造函数有着相同的书写方式,但是要用 convenience 修饰符放到 init 关键字前,用空格隔开
convenience init(parameters) {
    statements
}

类类型的构造函数委托

class Car{
    var speed:Double    
    //Designated Initializer
    init(speed:Double) {
        self.speed = speed
    }
    convenience init(){
        self.init(speed: 60.0)
    }
}

class Bus : Car {    
    var wheels : Int 
    init(wheels: Int) {      
        self.wheels = wheels   
        //由于子类继承了父类中的存储属性 所以必须借助父类的指定构造函数来初始化继承的那个存储属性的值
        //一定要在子类的属性初始化完毕以后调用
        super.init(speed: 120.0)
    }
    convenience init(){    
        self.init(wheels: 6)
    }
    
}

构造函数的继承与重写

class Person {
    var name: String!
    var weight: Double
    // 普通自定义构造函数
    init(name: String) {
        self.name = name
        self.weight = 0.0
    }
    // 定义指定构造函数
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }
    
    // 定义便利构造函数
    convenience init(n name: String, w weight: Double) {
        // 便利构造函数必须调用同类中的指定构造函数
        self.init(name: name, weight: weight)
    }
    
    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

class Man: Person {
    var sex: String = "男"
    override init(name: String) {
        super.init(name: name)
        self.name = name
        self.weight = 0.0
    }
    override init(name: String, weight: Double) {
        
        self.sex = "女"
        // 子类的指定构造函数中必须调用父类的构造函数
        // 重写的时候,必须将调用父类的构造函数语句放在调用父类属性的前面
        super.init(name: name, weight: weight)
        self.name = name
        self.weight = weight
    }
    // 定义构造函数与父类的便利构造函数一样, 这里不算重写
    convenience init(showStr: String) {
        self.init(name: "", weight: 0.0)
        print(showStr)
    }
}

var manA = Man(name: "ZhangSan", weight: 62.0)
var manB = Man(showStr: "Hello Swift")

可失败的构造函数

struct Animal {
    let species: String
    init?(species: String) {
        //  返回一个nil
        if species.isEmpty { return nil }
        self.species = species
    }
}
//返回的类型是当前类型的可选型
let cat = Animal(species: "CAT")
if let cat = cat {   
    cat.species
}
let dog = Animal(species: "")
if let dog = dog {   
    dog.species   
}

必要构造函数

class SomeClass {
    required init() {
    }
}
class SomeSubclass: SomeClass {
    required init() {
    }
}

析构函数

//后面连()都没有
deinit {
    // 执行析构过程
}
示例练习
class Person {
    var name : String
    var age : Int

    init(name : String, age : Int) {
        print("Person-init")
        self.name = name
        self.age = age
    }

    deinit {
        print("Person-deinit")
    }
}

var person : Person? = Person(name: "Zhangsan", age: 18)
person = nil
上一篇 下一篇

猜你喜欢

热点阅读