美文网首页
swift学习之构造函数

swift学习之构造函数

作者: 天蚕 | 来源:发表于2016-05-12 17:25 被阅读66次

    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学习之构造函数

          本文链接:https://www.haomeiwen.com/subject/hqtprttx.html