Foundation

Hashable Protocol

public protocol Hashable : Equatable {

var hashValue: Int { get }

func hash(into hasher: inout Hasher)

}

Dùng để cung cấp 1 hashValue, từ giá trị này ta có thể so sánh 2 instance

Thông thường khi adopt Hashable Protocol swift sẽ tự động gen hash func bằng cách combine tất cả các thuộc tính của Object đó, tuy nhiên có những trường hợp không cần thiết ta có thể custom lại bằng cách chỉ combine các thuộc tính mà ta quan tâm. Ví dụ khi muốn so sánh 2 nhân viên, ta chỉ quan tâm lương của họ khi so sánh thì ta chỉ đơn giản combine duy nhất thuộc tính salary là đủ.

struct Employee {

var id: String

var name: String

var age: Int

var salary: Int

}


extension Employee: Hashable {

func hash(into hasher: inout Hasher) {

hasher.combine(id)

hasher.combine(name)

hasher.combine(age)

hasher.combine(salary)

}

}


let alex: Employee = Employee(id: "abc123456", name: "Alex", age: 22, salary: 99)

print(alex.hashValue)

Equatable Protocol

public protocol Equatable {

static func == (lhs: Self, rhs: Self) -> Bool

}

Comparable Protocol

public protocol Comparable {

static func < (lhs: Self, rhs: Self) -> Bool

}

CaseIterable Protocol

enum Season: CaseIterable {

case spring

case summer

case autumn

case winter

}


let allSeasons: [Season] = Season.allCases

Iterator Protocol

let animals: [String] = ["Antelope", "Butterfly", "Camel", "Dolphin"]


var animalIterator = animals.makeIterator()

while let animal = animalIterator.next() {

print(animal)

}

ExpressibleBy... Protocol

extension Int: ExpressibleByBooleanLiteral {

public init(booleanLiteral value: Bool) {

self.init(integerLiteral: value ? 1 : 0)

}

}


var expressibleIntByBool: Int = false

CustomStringConvertible Protocol

struct ReadableObject {

var name: String

}


extension ReadableObject: CustomStringConvertible {

var description: String {

"Using custom descriptions to improve debugging"

}

}


extension ReadableObject: CustomDebugStringConvertible {

var debugDescription: String {

"Using custom debug descriptions to improve debugging"

}

}