Equatable و Comparable (Equatable & Comparable)
اینجا دو پروتکل مهم را می بینیم: «برابرپذیر (Equatable)» و «قابل مقایسه (Comparable)». برابرپذیر یعنی بتوانیم با عملگر == برابری را چک کنیم. قابل مقایسه یعنی ترتیب را با عملگرهای مرتب سازی بسنجیم. مثال ها کوتاه اند و کاملاً مدرسه ای.
Equatable و Comparable چیست؟
با پذیرش Equatable و Comparable، نوعت از == و ترتیب پشتیبانی می کند. بنابراین می توانی چک کنی برابرند یا یکی کوچک تر است. این کار مرتب سازی و جست وجو را ساده می کند.
مشتق شده یا سفارشی؟
گاهی همگرایی به صورت خودکار مشتق می شود. اما برای کنترل دقیق، پیاده سازی سفارشی لازم است. سپس مساوی و کوچک تر را خودت تعریف می کنی.
نمونه: پیاده سازی مساوی و ترتیب
struct Point: Equatable, Comparable {
var x: Int
var y: Int
static func == (lhs: Point, rhs: Point) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
static func < (lhs: Point, rhs: Point) -> Bool {
return (lhs.x, lhs.y) < (rhs.x, rhs.y)
}
}
let a = Point(x: 1, y: 2)
let b = Point(x: 1, y: 3)
print(a == b)
print(a < b)
اینجا == برابر بودن را می سنجد. همچنین با < ترتیب دوتایی (x, y) مقایسه می شود. سپس می توانی مقادیر را مرتب کنی.
نکته: برای دسترسی سریع، صفحه Equatable و Comparable سویفت را ذخیره کن.
مرتب سازی با Comparable
وقتی نوعت Comparable باشد، می توانی آرایه ها را مستقیم مرتب کنی. همچنین تابع های min() و max() بهتر کار می کنند.
struct Score: Comparable {
let user: String
let value: Int
static func < (l: Score, r: Score) -> Bool {
return l.value < r.value
}
}
let scores = [
Score(user: "A", value: 10),
Score(user: "B", value: 5),
Score(user: "C", value: 7)
]
let sorted = scores.sorted()
print(sorted.map { $0.value })
print(sorted.last!.value)
گام های عملی
- کدها را در ادیتور اجرا کن.
- عملکرد
==و<را بررسی کن. - معیار مقایسه را تغییر بده و نتیجه را مقایسه کن.
جمع بندی سریع
- Equatable برای برابری است.
- Comparable برای ترتیب است.
- پیاده سازی سفارشی کنترل می دهد.
- مرتب سازی مستقیم ممکن می شود.