swift学习之构造函数

1、 子类没有实现父类的任何一个指定构造函数,那么子类将回继承父类的所有指定构造函数
2、子类实现了父类的所有指定构造函数,那么子类将回继承父类所有的便利构造函数
3、如果不想手动实现父类的必须构造函数required那么不要实现父类的任何构指定造函数,通过继承来实现父类的必须构造函数。如果要定义构造函数直接使用便利构造函数即可。
4、遍历构造函数convenience可以理解为工厂方法简化对象创建,必须调用指定构造函数,本身并不需要负责初始化工作

构造函数

构造函数都是以init开头的
构造函数可以为存储类型的属性赋初值, swift类和结构体创建实例时候,必须保证所有存储型属性都是有值的
构造函数对属性的初始化过程,是不能触发属性观察器的
如果自定义了构造方法那么默认的构造方法就会失效

默认构造方法

如果没有自定义过构造函数(没有手动实现过init开头的方法),那么系统会自动提供默认构造函数,所以子类并不一定要继承父类的构造器,目的是开辟内存空间,为所有的存储属性设置默认值,如果是可选性的属性,自动赋值为nil
默认构造器init(),因为每一个类型至少有一个指定构造器,所以类的默认构造器必定是指定构造器
结构体还会提供逐一成员构造器

struct Demo {
    private var _m = "m"
    var d:Int = 0;
    var e:String?
    var m:String{
        get{
           return _m
        }
        set{
           _m = newValue
        }
    }
}
//Demo的逐一成员构造器
Demo(_m: String, d: Int, e: String?)

自定义构造方法

如果自定义了构造方法那么默认的构造方法就会失效
构造函数中的可选值需要注意init(dict:)

init(dict:[String:NSObject])
{
    //必须调用,为的是给属性分配存储空间,但是super.init()在分配存
    //储空间的时候,如果发现属性是一个可选类型的对象才会给该属性分
    //配存储空间,而如果是一个可选型的基本数据类型,则不给器分配存
    //储空间,没有存储空间,赋值会奔溃
    super.init()
    //字典转模型
    setValuesForKeysWithDictionary(dict)
}

//与上面方法务必同时出现
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
}

类的继承和构造函数规则

默认的构造器就是指定构造器,以convenience修饰的构造器就是便利构造器
每个类至少有一个指定构造器
指定构造器必须调用其直接父类的指定构造器
便利构造器必须调用同一类中的其他构造器,并器最终调用一个指定构造器
类的默认构造器init()肯定是一个指定构造器

//父类
class Person: NSObject {
    override init() {
        super.init()
    }
   
    init(name:String) {
        super.init()
    }
}
//子类
class Student: Person {
    //指定构造器
    override init() {
        super.init()
    }
    //便利构造器
    convenience override init(name: String) {
        self.init()
    }
    //便利构造器
    convenience init(age:Int) {
        self.init()
    }
}

必要构造器

在类的构造器前添加一个require关键字这个构造器就成为必要构造器,在类重写父类的必要构造器同样需要添加require
requireoverride相遇只留require

析构函数

析构函数deinit类似于OC的dealloc方法,类似于移除通知中心这样的操作就在这里完成
同样的deinit不能被显示的调用

你可能感兴趣的:(swift学习之构造函数)