Swift init 方法的坑与填

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

{
    self = [super initWithFrame:frame];
    if (self) {
        self.buttonClickBlock = buttonClick;
    }
    return self;
}```
如此的简单明

swift汇总init方法被限制了些许,用过许多次了但也是一知半解,有些问题虽然很浅显,也着实让人恼火,小小的init,错了这么多次,忽略什么convenience
- 第一种就是这了,按照OC的方式,写一个init之后,会提示`initWithCoder`必须要实现,这个好解决,自动补齐就行了
![图片.png](http://upload-images.jianshu.io/upload_images/5315139-90dff26dd9e63fae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 补齐之后又来了

![图片.png](http://upload-images.jianshu.io/upload_images/5315139-71e0e2b170e7cdfd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
什么鬼,明明在里面赋值了,怎么还不行!原来`application`是子类的属性,子类的属性必须要在init之前创建,此时明显在init之前了
- 好嘛,我后super,总行了吧

![图片.png](http://upload-images.jianshu.io/upload_images/5315139-f4184d61dd7bbe76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
shit,又说我不能提前用title。。。
- 过好歹是一直给着提示,最终:

![图片.png](http://upload-images.jianshu.io/upload_images/5315139-65dcb0f0c7c9404e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#### 总结
  init的时候,除去convenience什么的不说,单单init方法中,就要分两部分写,子类自有的属性,需要在super之前创建,而父类所拥有的属性,需要在`super.init`之后赋值,

  > 其实从OC转变过来的我有个疑问,不是应该调完***super.init***之后才创建了当前实例么,之前set属性是给谁set的?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容