Equatable
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 38 من 57.
Equatable يمنح النوع العاملين == و!=. بالنسبة إلى البنى والتعدادات التي تكون جميع خصائصها Equatable، يكفي التصريح بالتوافق، وتقارن Swift كل خاصية:
struct Card: Equatable {
let rank: Int
let suit: String
}
let a = Card(rank: 10, suit: "hearts")
let b = Card(rank: 10, suit: "hearts")
print(a == b)
print(a != Card(rank: 2, suit: "hearts"))الناتج:
true
trueلمقارنة بعض الخصائص فقط، اكتب static func == بنفسك. هنا يُعدّ مستخدمان متساويين عندما تتطابق معرّفاتهما، بغضّ النظر عن اسميهما:
struct User: Equatable {
let id: Int
var name: String
static func == (lhs: User, rhs: User) -> Bool {
lhs.id == rhs.id
}
}
print(User(id: 1, name: "Ada") == User(id: 1, name: "Ada L."))
print(User(id: 1, name: "Ada") == User(id: 2, name: "Ada"))الناتج:
true
falseEquatable يتيح أساليب قياسية تتطلب المقارنة، مثل contains(_:) وfirstIndex(of:) و== على المصفوفات بأكملها:
struct Point: Equatable {
let x: Int, y: Int
}
let path = [Point(x: 0, y: 0), Point(x: 1, y: 2)]
print(path.contains(Point(x: 1, y: 2)))
print(path.firstIndex(of: Point(x: 1, y: 2))!)
print(path == [Point(x: 0, y: 0), Point(x: 1, y: 2)])الناتج:
true
1
trueلا تحصل الفئات على == مجانًا: فهي تقارن الهوية باستخدام ===. يجب على الفئة التي ينبغي أن تقارن حسب القيمة أن تنفّذ == بنفسها:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}التحدي
سهليحتوي Product على sku وname وprice. يكون المنتجان متطابقين عندما يتطابق sku الخاص بهما، بغضّ النظر عما تقوله الحقول الأخرى. اجعل Product يتوافق مع Equatable باستخدام == مخصّص، ثم أكمل mergeCatalog(_:)، الذي يحتفظ بأول ظهور لكل منتج (باستخدام contains) ويُرجع أسطر sku name price متبوعةً بـ removed: 2.
يقرأ الكود المُقدَّم المنتجات على هيئة أسطر بتنسيق sku,name,price ويطبع كل سطر مُعاد.
يجب أن تضع كودك في Product.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج المُقدَّم، ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let products = input.map { line -> Product in
let p = line.split(separator: ",").map(String.init)
return Product(sku: p[0], name: p[1], price: Int(p[2])!)
}
for line in mergeCatalog(products) { print(line) }
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift