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的?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容