Swift Academy · درس

دلالات المساواة المخصصة

نفّذ قواعد مساواة صحيحة بالنسبة إلى المجال.

الدرس 4 من 413 خطوة

دلالات المساواة المخصصة درس مجاني في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏Equatable المُنشأ تلقائيًا
  2. ‏Hashable و hash(into:)
  3. ‏Comparable والترتيب
  4. دلالات المساواة المخصصة
← العودة إلى Swift Academy