0Pricing
Swift Academy · درس

‏Comparable والترتيب

حدّد الترتيب باستخدام < للفرز.

‏Comparable والترتيب درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

ما هو Comparable؟

يوفّر Comparable عوامل ترتيب للنوع: < و<= و> و>=. ويتيح الالتزام به استدعاء sorted() وmin() وmax() مباشرةً.

الالتزام باستخدام <

لا تنفّذوا سوى <؛ أما العوامل الأخرى فتُشتق تلقائيًا. (ويلزم أيضًا الالتزام بـ Equatable.)

struct Version: Comparable {
    let major: Int
    static func < (l: Version, r: Version) -> Bool { l.major < r.major }
}
print(Version(major: 1) < Version(major: 2))  // true

فرز نوع من Comparable

عند استخدام Comparable، لا يحتاج sorted() إلى دالة إغلاق:

struct Score: Comparable {
    let points: Int
    static func < (l: Score, r: Score) -> Bool { l.points < r.points }
}
let sorted = [Score(points: 3), Score(points: 1), Score(points: 2)].sorted()
print(sorted.map { $0.points })  // [1, 2, 3]

احصلوا على min وmax مجانًا

يتيح Comparable أيضًا دوالًا مساعدة للتجميع:

struct Temp: Comparable {
    let c: Int
    static func < (l: Temp, r: Temp) -> Bool { l.c < r.c }
}
let temps = [Temp(c: 20), Temp(c: 5), Temp(c: 30)]
print(temps.min()!.c, temps.max()!.c)  // 5 30

الترتيب حسب عدة مفاتيح

لكسر التعادل بين عدة حقول، قارنوها حسب الأولوية داخل < باستخدام الصفوف — إذ يقارن Swift الصفوف ترتيبًا معجميًا.

حيلة مقارنة الصفوف

قارنوا حسب اسم العائلة، ثم الاسم الأول:

struct Person: Comparable {
    let last: String
    let first: String
    static func < (l: Person, r: Person) -> Bool {
        (l.last, l.first) < (r.last, r.first)
    }
}
let p = [Person(last: "Lee", first: "Bo"), Person(last: "Lee", first: "An")].sorted()
print(p.map { $0.first })  // ["An", "Bo"]

الفرز من دون Comparable

يمكنكم دائمًا استخدام الفرز مع دالة إغلاق لاحقة حتى إذا لم يكن النوع من نوع Comparable:

struct Item { let name: String; let qty: Int }
let items = [Item(name: "B", qty: 2), Item(name: "A", qty: 5)]
let byQty = items.sorted { $0.qty > $1.qty }
print(byQty.map { $0.name })  // ["A", "B"]

الفرز التنازلي

اعكسوا المقارنة أو استدعوا .reversed():

let nums = [3, 1, 4, 1, 5]
print(nums.sorted(by: >))         // [5, 4, 3, 1, 1]
print(nums.sorted().reversed())   // [5, 4, 3, 1, 1]

sorted مقارنةً بـ sort

تعيد sorted() مصفوفة جديدة، بينما تعدّل sort() المصفوفة في مكانها (ولذلك يلزم استخدام var):

var nums = [3, 1, 2]
nums.sort()
print(nums)  // [1, 2, 3]
let copy = [3, 1, 2].sorted()
print(copy)  // [1, 2, 3]

فرز مستقر بما يكفي

يضمن Swift استقرار الفرز منذ Swift 5: إذ تحافظ العناصر المتساوية على ترتيبها النسبي. اعتمدوا على ذلك للحصول على فرز متوقع عند إجراء عدة عمليات فرز متتالية:

let words = ["bb", "a", "cc", "d"]
let byLen = words.sorted { $0.count < $1.count }
print(byLen)  // ["a", "d", "bb", "cc"]  -- "a" before "d", "bb" before "cc"

الفرز حسب مسار خاصية

يمكنكم الفرز باستخدام دالة إغلاق تقرأ أي خاصية من دون جعل النوع بأكمله يلتزم بالبروتوكول:

struct Player { let name: String; let score: Int }
let players = [Player(name: "A", score: 30), Player(name: "B", score: 50)]
let ranked = players.sorted { $0.score > $1.score }
print(ranked.map { $0.name })  // ["B", "A"]

تحقق سريع

ما العامل الوحيد الذي يجب تنفيذه للالتزام بـ Comparable؟

مراجعة

لقد تعلمتم Comparable:

  • يوفّر Comparable عوامل الترتيب؛ ولا تنفّذوا سوى <
  • يتيح sorted() وmin() وmax() من دون دالة إغلاق
  • تسهّل مقارنة الصفوف الترتيب حسب عدة مفاتيح
  • تعيد sorted() مصفوفة جديدة، بينما تعدّل sort() المصفوفة؛ والفرز مستقر

التالي: دلالات المساواة المخصصة.

الأسئلة الشائعة

هل درس «‏Comparable والترتيب» مجاني؟

نعم — نص درس «‏Comparable والترتيب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏Comparable والترتيب»؟

حدّد الترتيب باستخدام < للفرز. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏Comparable والترتيب»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

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

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