美文网首页iOS-swift
Swift init 方法的坑与填

Swift init 方法的坑与填

作者: 山已几孑 | 来源:发表于2017-05-30 13:00 被阅读275次

    OC的时候,在init方法中给class一些创建过程中必填的属性,是很常用的方法了
    比如

    {
        self = [super initWithFrame:frame];
        if (self) {
            self.buttonClickBlock = buttonClick;
        }
        return self;
    }```
    如此的简单明
    
    swift汇总init方法被限制了些许,用过许多次了但也是一知半解,有些问题虽然很浅显,也着实让人恼火,小小的init,错了这么多次,忽略什么convenience
    - 第一种就是这了,按照OC的方式,写一个init之后,会提示`initWithCoder`必须要实现,这个好解决,自动补齐就行了
    ![图片.png](http:https://img.haomeiwen.com/i5315139/90dff26dd9e63fae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    - 补齐之后又来了
    
    ![图片.png](http:https://img.haomeiwen.com/i5315139/71e0e2b170e7cdfd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    什么鬼,明明在里面赋值了,怎么还不行!原来`application`是子类的属性,子类的属性必须要在init之前创建,此时明显在init之前了
    - 好嘛,我后super,总行了吧
    
    ![图片.png](http:https://img.haomeiwen.com/i5315139/f4184d61dd7bbe76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    shit,又说我不能提前用title。。。
    - 过好歹是一直给着提示,最终:
    
    ![图片.png](http:https://img.haomeiwen.com/i5315139/65dcb0f0c7c9404e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    #### 总结
      init的时候,除去convenience什么的不说,单单init方法中,就要分两部分写,子类自有的属性,需要在super之前创建,而父类所拥有的属性,需要在`super.init`之后赋值,
    
      > 其实从OC转变过来的我有个疑问,不是应该调完***super.init***之后才创建了当前实例么,之前set属性是给谁set的?
    
    

    相关文章

      网友评论

      • Pr_Chen:请阅读Swift的两段式构造器
      • 凡哥哥:不知道是不是与横向继承 与 纵向继承有关?
      • 君赏:这个和oc不一致,我猜测。先创建当前类对象,赋值完毕,如果有父类也需要创建父类对象对父类进行赋值 之后把子类一些属性重写父类
        因为oc必须继承nsobject 但是Swift不需要继承任何类就可以。
        这估计就是区别导致初始化不同了,这是我猜想,我其实也不太清楚为啥这样设计

      本文标题:Swift init 方法的坑与填

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