實(shí)現(xiàn)equatable協(xié)議的類型可以進(jìn)行 “==” 和 ”!=“ 操作搀矫。在swift標(biāo)準(zhǔn)庫(kù)的大多數(shù)類型都實(shí)現(xiàn)了此協(xié)議拌滋,包括String, Int等
一些序列和集合實(shí)現(xiàn)這個(gè)協(xié)議的時(shí)候,使用起來(lái)將會(huì)更簡(jiǎn)單、方便。
先看一下Equatable協(xié)議
<pre>
public protocol Equatable {
public static func ==(lhs: Self, rhs: Self) -> Bool
}
</pre>
數(shù)組本身已經(jīng)實(shí)現(xiàn)Equatable協(xié)議,下面是數(shù)組的一個(gè)簡(jiǎn)單例子:
<pre>
let students = ["Nora", "Fern", "Ryan", "Rainer"]
let nameToCheck = "Ryan"
//對(duì)數(shù)組元素進(jìn)行contains操作
if students.contains(nameToCheck) {
print("(nameToCheck) is signed up!")
} else {
print("No record of (nameToCheck).")
}
</pre>
對(duì)于自定義遵守Equatable協(xié)議的類型弊仪,必須要實(shí)現(xiàn) ”==“ 作為類型的靜態(tài)方法熙卡,而對(duì)于 ”!=“ 標(biāo)準(zhǔn)庫(kù)已經(jīng)提供了默認(rèn)的方法
另外還需要符合三個(gè)規(guī)則:
1.自反性 a == a
2.對(duì)稱性 a == b
等同 b == a
3.傳遞性 a == b
和 b == c
推出 a == c
一個(gè)自定義類型簡(jiǎn)單的例子
<pre>
struct StreetAddress {
let number: String ///門牌號(hào)
let street: String ///街道
let unit: String? ///樓棟單元
init(_ number: String, _ street: String, unit: String? = nil) {
self.number = number
self.street = street
self.unit = unit
}
}
//StreetAddress遵守Equatable協(xié)議
extension StreetAddress: Equatable {
//必須要實(shí)現(xiàn)的靜態(tài)方法 “==”
static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
return
(lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit)
}
}
let addresses = [StreetAddress("1490", "Grove Street"),
StreetAddress("2119", "Maple Avenue"),
StreetAddress("1400", "16th Street")]
let home = StreetAddress("1400", "16th Street")
print(addresses[0] == home)
print(addresses.contains(home))
</pre>
一個(gè)類實(shí)例的標(biāo)識(shí)不是實(shí)例的值的一部分杖刷,也就是說(shuō)判斷兩個(gè)實(shí)例的值是否相等,類型是不作為判斷依據(jù)的驳癌,換包話說(shuō) ‘==’, 不判斷類型滑燃,如果要參與類型的判斷,那么就要使用 ‘===’