前言
Swift
標(biāo)準(zhǔn)庫為我們提供了55中協(xié)議,基本都是以Type
担敌、able
、Convertible
結(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ù)、方法或者初始化容器里作為形參或者返回類型