iOS學(xué)習(xí)筆記之Swift中常見的協(xié)議

前言

Swift標(biāo)準(zhǔn)庫為我們提供了55中協(xié)議,基本都是以Type担敌、ableConvertible結(jié)尾的廷蓉。

Type結(jié)尾的協(xié)議全封,表示可以被當(dāng)作某種類型;

able結(jié)尾的協(xié)議桃犬,表示具備某種能力或者特性刹悴;

Convertible結(jié)尾的協(xié)議,表示能夠進行改變或者變化攒暇。

Swift標(biāo)準(zhǔn)庫中的55個協(xié)議

AbsoluteValuable
AnyCollectionType,
AnyObject
ArrayLiteralConvertible
BidirectionalIndexType
BitwiseOperationsType
BooleanLiteralConvertible
BooleanType
CVarArgType
CollectionType
Comparable
CustomDebugStringConvertible
CustomLeafReflectable
CustomPlaygroundQuickLookable
CustomReflectable
CustomStringConvertible
DictionaryLiteralConvertible
Equatable
ErrorType
ExtendedGraphemeClusterLiteralConvertible
FloatLiteralConvertible
FloatingPointType
ForwardIndexType
Generator Type
Hashable
Indexable
IntegerArithmeticType
IntegerLiteralConvertible
IntegerType
IntervalType
LazyCollectionType
LazySequenceType
MirrorPathType
MutableCollectionType
MutableIndexable
MutableSliceable
NilLiteralConvertible
OptionType
OutputStreamType
RandomAccessIndexType
RangeReplaceableCollectionType
RawRepresentable
ReverseIndexType
SequenceType => Sequence
SetAlgebraType
SignedIntegerType
SignedNumberType
Streamable
Strideable
StringInterpolationConvertible
StringLiteralConvertible
UnicodeCodecType
UnicodeScalarLiteralConvertible
UnsignedIntegerType

常見的協(xié)議

Equatable

Equatable比較相關(guān)的協(xié)議土匀,遵循該協(xié)議表示實例能夠用于做相等的比較,但是需要重載==運算符形用。

struct Person: Equatable {
    var name: String
    var age: Int
    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
}

Hashable

哈希表是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)就轧。Swift中字典由兩種泛型類型組成,其中Key必須實現(xiàn)Hashable協(xié)議田度。

public protocol Hashable : Equatable {
    var hashValue: Int { get }
    func hash(into hasher: inout Hasher)
}

通過以上源碼可以看出Hashable是遵循了Equable妒御。

Comparable

Comparable是基于Equatable的一種延續(xù),同樣用于比較相關(guān)的協(xié)議镇饺,遵循該協(xié)議的實例能夠進行比較乎莉,但是需要重載<運算符。

struct Person: Comparable {
    var name: String
    var age: Int
    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.age < rhs.age
    }
}

CustomStringConvertible

CustomStringConvertible提供了一種用文本表示一個對象或者結(jié)構(gòu)的描述的方式,可以在任何遵循該協(xié)議的類型中自定義結(jié)構(gòu)的文本惋啃,但是一定需要覆蓋description的屬性哼鬓。

struct Person: CustomStringConvertible {
    var name: String
    var age: Int
    var description: String {
        return "\(name)" + "的年齡是" + "\(age)"
    }
}

ExpressibleByArrayLiteral

ExpressibleByArrayLiteral提供了使用數(shù)組文本初始化的類型的能力,具體就是使用逗號分割的值边灭、實例魄宏、字面值列表

struct Person: ExpressibleByArrayLiteral {
    typealias ArrayLiteralElement = Any
    
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    init(arrayLiteral elements: Person.ArrayLiteralElement...) {
        var name: String = ""
        if let nm = elements.first as? String {
            name = nm
        }
        var year: Int = 0
        if let aage = elements[1] as? Int {
            year = aage
        }
        self.init(name: name, age: year)
    }
}

使用協(xié)議的好處

協(xié)議可以當(dāng)作類型使用

蘋果在Swift中提出協(xié)議可以作為一種類型,并且在官方文檔中還為開發(fā)者具體指出了可以將協(xié)議當(dāng)作類型使用的具體場景:

  • 作為常量存筏、變量或者屬性的類型
  • 作為數(shù)組宠互、字典或者其他存儲器的元素類型
  • 在函數(shù)、方法或者初始化容器里作為形參或者返回類型
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椭坚,一起剝皮案震驚了整個濱河市予跌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌善茎,老刑警劉巖券册,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垂涯,居然都是意外死亡烁焙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門耕赘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骄蝇,“玉大人,你說我怎么就攤上這事操骡【呕穑” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵册招,是天一觀的道長岔激。 經(jīng)常有香客問我,道長是掰,這世上最難降的妖魔是什么虑鼎? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮键痛,結(jié)果婚禮上炫彩,老公的妹妹穿的比我還像新娘。我一直安慰自己散休,他們只是感情好媒楼,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著戚丸,像睡著了一般划址。 火紅的嫁衣襯著肌膚如雪扔嵌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天夺颤,我揣著相機與錄音痢缎,去河邊找鬼。 笑死世澜,一個胖子當(dāng)著我的面吹牛独旷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寥裂,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼嵌洼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了封恰?” 一聲冷哼從身側(cè)響起麻养,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诺舔,沒想到半個月后鳖昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡低飒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年许昨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥赊。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡糕档,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崭倘,到底是詐尸還是另有隱情翼岁,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布司光,位于F島的核電站,受9級特大地震影響悉患,放射性物質(zhì)發(fā)生泄漏残家。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一售躁、第九天 我趴在偏房一處隱蔽的房頂上張望坞淮。 院中可真熱鬧,春花似錦陪捷、人聲如沸回窘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啡直。三九已至烁涌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酒觅,已是汗流浹背撮执。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舷丹,地道東北人抒钱。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像颜凯,于是被迫代替她去往敵國和親谋币。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容