Stanford iOS10 公開課知識點(6)

Crazy巴旦木發表於2018-06-05
Thrown Errors 錯誤處理

每當我們呼叫一個可以丟擲錯誤的方法時,都需要用try這個詞,我們必須try呼叫這個方法因為它可能出錯,當方法被宣告的時候,後面跟一個詞throws,throws意味著這個方法在執行過程中的某處,可能但不一定,會丟擲一個錯誤,所以當它丟給我們一個錯誤時,我們需要接住它,接住錯誤的方法是我們必須在do結構裡面使用try,do{try } catch let error( error可以隨便起,這個變數來放置錯誤資訊){throw error},error有確定型別叫Error,它是個協議,在UIKit中,丟擲的異常錯誤型別是NSError。 現在我們呼叫一個可以丟擲錯誤的函式,並且我們保證它不出錯,就可以用try!感嘆號的意思就是將它強行變成一個Optional,如果丟擲了錯誤,那麼程式就會崩潰。還有另一種try?意思是嘗試呼叫這個可以丟擲錯誤的方法,如果丟擲了錯誤,那麼返回nil就可以了。

Extension

擴充套件可以讓你給另一個類或結構列舉新增方法或變數。在擴充套件的程式碼中可以引用self,當我們引用self時,它表示的是我們當前所在的類,在這種情況下,這個self代表的就是正在執行這個變數的UIViewController。擴充套件的限制,擴充套件不是物件導向中的子類和類似於子類的東西的替代品,有一點就是你不能重寫已經存在的東西。所以你不能用擴充套件重寫或者繼承。你只能寫新的,本來不存在的東西。當你試著在擴充套件中新增原來已有的內容的時候,你甚至會得到一個錯誤。擴充套件的一個很大的限制是他們沒有任何儲存空間,擴充套件中唯一能存在的變數就是計算變數,它們不能有任何儲存變數。不要濫用擴充套件,擴充套件對你構築程式碼非常有幫助。

Protocols

協議是簡單並且極其強大的,協議是宣告一種型別的方式,這個類裡面一般包含了一些未被實現的方法和變數,這就是協議。它允許你建立一個Api使得呼叫者可以傳遞任何它想傳遞的東西,就像類,結構體,甚至是列舉。所以協議就是方法和屬性的宣告的集合。協議中的方法和變數的實現,由於協議僅僅是宣告瞭它們,大部分實現的地方在聲稱要實現或者遵從這個協議的類和結構體或列舉裡,也可以在擴充套件中實現協議。 協議的一個特性叫可選方法(Optional Methods)。意味著協議中的方法是可選的。如果你的Protocol有可選的方法,需要用@objc標記,把@objc放到protocol這個詞的前面,表示這個是Objective-C協議,然後你可以把optional放到任何一個你想讓它變成可選的函式或者變數前面。 協議支援多重繼承(多重繼承就是可以有兩個父類,Swift不支援),但是Swift支援協議的多重繼承,在協議裡面你可以寫屬性和函式。如果你寫了屬性,你需要在大括號裡指明這個是可讀還是隻讀的屬性。如果想讓列舉,尤其是結構體實現協議中預計會改變要實現它的函式,需要mutating標記它,如果是個類想要實現這個協議就不需要標記mutating。在協議冒號後面新增class可以限定協議只被類實現。可以指定協議中的構造器,如果這麼寫了,任何想要實現協議的東西必須能夠被這些引數初始化。如果是個類的話,需要在構造器前面加個required。類實現協議,需要先繼承父類,然後再協議。列舉和結構體沒有父類,冒號後面就是協議名。你可以實現任何數量的協議。你可以把協議新增到結構體,列舉或者類的擴充套件中,只要是不需要任何儲存空間就行。 協議是個型別,它僅僅是個型別,任何遵循這個型別的東西可以儲存在某些東西里,或者被傳遞給這個型別的某些東西。所有的Swift的標準庫,陣列和字典,等等都是通過協議實現的。 協議還可以限制泛型。(泛型:一個型別為陣列,這個陣列可以放任何型別的東西。),陣列T可以被限定為實現某個特定的協議。比如range想讓它的型別是可比較的,就需要Comparable協議限制型別。用一些協議來限制泛型的型別,它允許你建立更多種類繁多的泛型資料結構,因為你可以讓它們必須實現特定的協議來運作。你還可以用泛型去宣告協議,你可以寫個協議,它的方法可能是個泛型,通過新增泛型,限定泛型的型別,可以讓協議變的非常強大。

相關文章