دلالات المساواة المخصصة
نفّذ قواعد مساواة صحيحة بالنسبة إلى المجال.
دلالات المساواة المخصصة درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
متى يكون == الافتراضي غير مناسب؟
يقارن == المُنشأ تلقائيًا كل خاصية مخزنة. وقد يكون ذلك صارمًا أكثر من اللازم (فأنتم تهتمون بالمعرّف فقط) أو متساهلًا أكثر من اللازم. عندها تكتبون == بأنفسكم.
المساواة القائمة على الهوية
اعتبروا سجلين متساويين عندما يتطابق المعرّفان، مع تجاهل الحقول الأخرى:
struct Account: Equatable {
let id: Int
var balance: Int
static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 1, balance: 10) == Account(id: 1, balance: 999)) // trueالمساواة غير الحساسة لحالة الأحرف
طبّعوا القيم قبل مقارنتها:
struct Username: Equatable {
let raw: String
static func == (l: Username, r: Username) -> Bool {
l.raw.lowercased() == r.raw.lowercased()
}
}
print(Username(raw: "Ann") == Username(raw: "ANN")) // trueالحفاظ على اتساق Hashable
إذا خصصتم ==، فيجب عليكم تحديث hash(into:) لاستخدام الحقول نفسها، وإلا فقد تنتج القيم المتساوية قيم تجزئة مختلفة، مما يؤدي إلى إفساد عمل Sets.
مطابقة == وhash(into:)
يستخدم كلاهما id فقط، وبذلك يحافظان على الاتساق:
struct User: Hashable {
let id: Int
var name: String
static func == (l: User, r: User) -> Bool { l.id == r.id }
func hash(into h: inout Hasher) { h.combine(id) }
}
print(Set([User(id: 1, name: "A"), User(id: 1, name: "B")]).count) // 1مساواة تتجاهل ذاكرة التخزين المؤقت
استبعدوا الحقول المشتقة أو المخزنة مؤقتًا من المقارنة:
struct Doc: Equatable {
let text: String
var cachedWordCount: Int
static func == (l: Doc, r: Doc) -> Bool { l.text == r.text }
}
let a = Doc(text: "hi", cachedWordCount: 1)
let b = Doc(text: "hi", cachedWordCount: 999)
print(a == b) // trueمساواة متسامحة للأعداد العشرية
قارنوا القيم العشرية ضمن حدّ سماح بدلًا من مقارنتها بدقة تامة:
struct Measure: Equatable {
let value: Double
static func == (l: Measure, r: Measure) -> Bool {
abs(l.value - r.value) < 0.0001
}
}
print(Measure(value: 0.1 + 0.2) == Measure(value: 0.3)) // trueالمساواة عبر مجموعة فرعية من الحقول
قارنوا مجموعة فرعية ذات معنى لتحقيق المساواة الخاصة بالمجال:
struct Card: Equatable {
let rank: Int
let suit: String
let isFaceUp: Bool // display state, not identity
static func == (l: Card, r: Card) -> Bool {
l.rank == r.rank && l.suit == r.suit
}
}
print(Card(rank: 1, suit: "H", isFaceUp: true) == Card(rank: 1, suit: "H", isFaceUp: false)) // trueاحترام قوانين Equatable
يجب أن يحافظ == المخصص على خاصية الانعكاسية (a == a)، والتناظر (إذا كانت a == b، فهذا يعني b == a)، والتعدي. يؤدي انتهاك هذه القواعد إلى إرباك المجموعات والخوارزميات.
تنفيذ متناظر
تحافظ مقارنة الأشكال المطبّعة على التناظر:
struct Email: Equatable {
let address: String
static func == (l: Email, r: Email) -> Bool {
l.address.lowercased() == r.address.lowercased()
}
}
let x = Email(address: "A@x.com")
let y = Email(address: "a@X.com")
print(x == y, y == x) // true trueالمساواة المخصصة في Set
بما أن المساواة والتجزئة المعتمدتين على المعرّف فقط متوافقتان، فإن Set يتعامل مع القيم ذات المعرّف نفسه باعتبارها قيمة واحدة:
struct Item: Hashable {
let id: Int
var note: String
static func == (l: Item, r: Item) -> Bool { l.id == r.id }
func hash(into h: inout Hasher) { h.combine(id) }
}
let s: Set<Item> = [Item(id: 1, note: "x"), Item(id: 1, note: "y")]
print(s.count) // 1تحقق سريع
بعد كتابة == مخصص يستخدم بعض الحقول فقط، ما الإجراء الآخر الذي يجب عليكم اتخاذه؟
مراجعة
لقد تعلمتم المساواة المخصصة:
- اكتبوا
==بأنفسكم عندما تكون مقارنة البنية بأكملها افتراضيًا غير مناسبة - من الحالات الشائعة: المعرّف فقط، وعدم الحساسية لحالة الأحرف، والأعداد العشرية مع حد سماح، وتجاهل ذاكرة التخزين المؤقت
- حافظوا على اتساق
hash(into:)باستخدام الحقول نفسها - حافظوا على الانعكاسية والتناظر والتعدي
اكتملت الدورة! التالي: CustomStringConvertible وMirror.
تعلم Swift مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 122
- الدروس
- 409
الأسئلة الشائعة
هل درس «دلالات المساواة المخصصة» مجاني؟
نعم — نص درس «دلالات المساواة المخصصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «دلالات المساواة المخصصة»؟
نفّذ قواعد مساواة صحيحة بالنسبة إلى المجال. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «دلالات المساواة المخصصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Equatable المُنشأ تلقائيًا
- Hashable و hash(into:)
- Comparable والترتيب
- دلالات المساواة المخصصة