swift標(biāo)準(zhǔn)庫(kù)為我們提供了大量的協(xié)議,使用這些協(xié)議可以讓我們的程序更加高效。同時(shí)我們也可以從Apple官方實(shí)現(xiàn)的協(xié)議中學(xué)習(xí),從而寫(xiě)出更好的swift程序以及按照自己的需求自定義一個(gè)協(xié)議。(更多可了解面向協(xié)議編程)
常用的幾個(gè)協(xié)議
Hashable : 可哈?;?/strong>
-
Hashable繼承于Equatable協(xié)議 - 在標(biāo)準(zhǔn)庫(kù)中,大部分基本類型都是遵循
Hashable協(xié)議的,如Int、String等 - 使用
Dictionary或Set等數(shù)據(jù)結(jié)構(gòu)時(shí),要求作為Key的類型要實(shí)現(xiàn)Hashable協(xié)議 - 在swift4.2之后,如果一個(gè)
struct中包含的數(shù)據(jù)類型是基本類型,那么在使它遵循Hashable時(shí)編譯器會(huì)自動(dòng)為它生成一組==和hash(into:)函數(shù)。 //如果想自己實(shí)現(xiàn)hash函數(shù),大多數(shù)情況下這樣就可以 func hash(into hasher: inout Hasher) { hasher.combine(xxx) hasher.combine(xxx) }
Codable : 可以轉(zhuǎn)解碼
-
Codable實(shí)際上是由Encodable&Decodable組成 - 遵循
Codable協(xié)議的對(duì)象會(huì)自動(dòng)實(shí)現(xiàn)Encodable&Decodable -
Decodable協(xié)議定義了一個(gè)初始化函數(shù):init(from decoder: Decoder) throws -
Encodable協(xié)議定義了一個(gè)方法:func encode(to encoder: Encoder) throws - 使用遵循
Codinkey協(xié)議的一個(gè)enum可以自定義要解析的鍵值名 - Codable的主要使用場(chǎng)景是將JSON數(shù)據(jù)解析為模型數(shù)據(jù),需要將要解析的內(nèi)容設(shè)置成可選型,否則如果JSON中某數(shù)據(jù)為空的話將會(huì)解析失敗。
- 解析數(shù)據(jù)時(shí)只需要使用一個(gè)
JSONDecoder實(shí)例,調(diào)用它的decode的方法就可以實(shí)現(xiàn)解析。如let student = try JSONDecoder().decode(Student.self,from: json)
Equatable : 可比較
- 基本數(shù)據(jù)類型默認(rèn)實(shí)現(xiàn)了
Equatable - 要讓自定義類型實(shí)現(xiàn)
Equatable的話,可以使用extension,在extension中遵循Equatable協(xié)議,并且實(shí)現(xiàn)需要的例如==等方法 - Comparable協(xié)議類似
TINO WU