標籤:ios8 swift paul hegarty init 初始化
這一話首先來講寫關於init的東西。
首先初始化並不會經常被用到,這是因為類和結構體中的大部分屬性都會通過賦值被初始化,或者有些屬性是Optional的,這樣即使是nil也沒關係,可以在之後再給它們賦值,就好比StoryBoard中的outlet,又或者可以使用閉包來初始化,或者使用lazy來避開init,所以有很多方法來避免init,除非你確實需要一個init的時候,那麼該怎麼做呢?
在一些情況下會自動產生init,其中一種情況是當類中的所有屬性都有初始值的時候,你會自動得到一個沒有參數的初始化方法。結構體的話它會預設得到一種將所有屬性作為參數的初始化方法,僅當結構體中沒有初始化方法的時候,如樣本中可以通過圓括弧中的賦值來初始化一個MyStruct結構體。
那麼初始化方法可以做什麼呢。首先我們可以在初始化方法中重設預設值,比如預設值是3,而初始化方法中把它賦值為4,那麼它的值就會變成4。甚至如果你的屬性是一個let定義的常量,依舊可以在init方法中為它賦值。在你的類和結構體中你可以調用其他的初始化方法,使用self.init,這樣你可以調用有不同參數的其他初始化方法。當然在類中你可以調用super.init,當然調用父類的init方法時有很多規則。
那麼在init的時候有什麼是你必須要做的嗎?首先在任何的init方法完成時你必須保證所有的屬性都被初始化了,注意如果有一個Optional它的值是nil,也算它有值。
在類中Swift提供兩種方法來初始化,注意不是在結構體中而是在類中,一種是Convenience Initializer,其他的都是另外一種init,叫做Designated Initializers,Designated Initializers是預設的初始化方法。一個Designated Initializer只能調用它父類中的Designated Initializer,這是一個非常重要的規則,如果有一個Designated Initializer,它的前面沒有convenience這個單詞,必須在init中調用父類的init而不能調用自身的其他init,並且父類中的init也必須是Designated類型的。
另外,你必須在調用父類的初始化方法時,首先初始化你自己的所有屬性!
你必須先讓父類給它的屬性賦值然後你才能給它們賦值!
Convenience Initializer有不同的特性,它必須而且只能調用本類中的designated initializer ,它不能調用任何父類的初始化方法,它可以通過其他Convenience Initializer來間接調用designated initializer。
Convenience Initializer必須直接或者間接調用designated initializer之後才能訪問其他值。
最後,調用類中的方法和屬性必須在初始化完成之後才能進行。
下面來聊聊繼承式初始化
如果你沒有在你的類中實現任何designated initializer,那麼你將繼承你父類中的所有designated initializers,否則你將不繼承你父類中的任何designated initializer。
如果你重寫了所有的designated initializer,那麼你將繼承父類中所有的Convenience Initializer。
如果你在初始化方法前加上required關鍵字的話,這個類的子類就必須實現它的這個初始化方法。
那麼failable init呢?有一些初始化方法允許失敗並且返回nil,它的定義中init後面跟著一個?,看了之前的幾話大家對?應該是很熟悉了,樣本中展示了一個UIImage,它可以通過圖片名稱從項目中獲得一個圖片,當然如果項目中沒有這個圖片的話,它就會返回nil。通常面對這種failable init,我們使用if let結構,如果初始化成功我們就執行動作,否則就做其他工作。在Swift中我們很少使用java中常用的try和catch,可選型的出現讓try-catch變得不是必須的。
講了這麼多關於初始化的知識,那麼該如何建立一個對象呢?做法是在想要建立的對象名稱後面加一對圓括弧,括弧內是初始化方法的參數。但是並不是一直使用這種方法,有時候你會使用一個類方法或者類型方法去建立。如樣本中所示,我們建立一個按鈕的時候使用了UIButton這種類型的一個方法。
還有一種比較少用的初始化方法,有些時候你的一些對象會協助你建立另一些對象,例如String中有一個非常酷的方法叫做join,join接受一個有字串組成的數組並且用join的方式隔開,所以上面的樣本會返回給你一個由“,”隔開的字串,把myArray分割成兩部分,這明顯是建立了一個新的數組。
【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記6 init