Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

sorted(by:)

جزء من قسم المنطق والتدفق في رحلة Swift على Coddy — الدرس 30 من 56.

لقد استخدمت .sorted() على مصفوفات من قيم Comparable مثل الأرقام أو النصوص. عندما تريد الفرز حسب شيء آخر، قم بتوفير closure يأخذ عنصرين ويعيد true عندما يجب أن يأتي العنصر الأول قبل الثاني.

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
print(byLength)              // ["hi", "hello", "banana"]

للترتيب التنازلي، قم بتبديل المقارنة:

let down = words.sorted { $0.count > $1.count }
print(down)                  // ["banana", "hello", "hi"]

يمكن للإغلاق (closure) مقارنة أي قيمة مشتقة، أو الطول، أو الحرف الأخير، أو إدخال في جدول هاش (hash). أياً كان ما يقارنه الإغلاق، فإنه يحدد الترتيب.

تعمل min(by:) و max(by:) بنفس الطريقة ولكنهما تعيدان عنصراً اختيارياً (optional) واحداً بدلاً من نسخة مرتبة.

challenge icon

التحدي

متوسط

اقرأ سطراً واحداً من المدخلات: قائمة مفصولة بفاصلة من أزواج name:age.

اطبع ثلاثة أسطر:

  1. الأسماء مرتبة حسب العمر تصاعدياً، مدمجة بـ ,. في حال التساوي في العمر، يتم ترتيب الأسماء المتساوية أبجدياً.
  2. اسم الشخص الأكبر سناً (استخدم max(by:)). في حال التساوي، يفوز الاسم الذي ظهر أولاً.
  3. اسم الشخص الأصغر سناً (استخدم min(by:)). في حال التساوي، يفوز الاسم الذي ظهر أولاً.

للمدخلات alice:30,bob:22,cara:30,dan:18، تكون المخرجات:

dan,bob,alice,cara
alice
dan

ورقة مرجعية

استخدم .sorted { } مع إغلاق (closure) مخصص للفرز بناءً على أي قيمة مشتقة. يأخذ الإغلاق عنصرين ويعيد true عندما يجب أن يسبق العنصر الأول العنصر الثاني:

let words = ["banana", "hi", "hello"]
let byLength = words.sorted { $0.count < $1.count }
// ["hi", "hello", "banana"]

للترتيب التنازلي، قم بتبديل العامل (operator):

let down = words.sorted { $0.count > $1.count }
// ["banana", "hello", "hi"]

تستخدم min(by:) و max(by:) نفس توقيع الإغلاق ولكنها تعيد عنصراً اختيارياً (optional) واحداً:

let longest = words.max(by: { $0.count < $1.count })  // "banana"
let shortest = words.min(by: { $0.count < $1.count }) // "hi"

جرّب بنفسك

let people = readLine()!.components(separatedBy: ",").map { pair -> (String, Int) in
    let parts = pair.components(separatedBy: ":")
    return (parts[0], Int(parts[1])!)
}

// مهام: الفرز حسب العمر تصاعدياً (المفاضلة بالاسم عند التساوي)؛ max(by:) للأكبر سناً؛ min(by:) للأصغر سناً
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق والتدفق