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"
}
}