ملاحظةدقيقتا قراءة

ثلاث مقارنات تفعلها المكتبة القياسيّة عنك

ثلاث طرق للاستفادة من مكتبة Swift القياسية: العثور على أول عنصر مطابق، والترتيب بأكثر من معيار، وفحص حدود الفهارس دون افتراض أنها تبدأ من الصفر.

عرض بصيغة Markdown

أحيانًا أكتب عدة أسطر، ثم أتذكر أن المكتبة القياسية في Swift توفر العملية نفسها. هذه ثلاث حالات تتكرر معي.

العثور على أول عنصر يطابق الشرط

let firstSeven = numbers.filter { $0 == 7 }.first

يفحص filter جميع العناصر وينشئ مصفوفة بالنتائج المطابقة، ثم يأخذ first أول عنصر منها. إذا كانت المصفوفة تحتوي على مئة عنصر وكان المطلوب في الموضع الثاني، نفّذنا ثمانيًا وتسعين مقارنة إضافية بلا حاجة.

let firstSeven = numbers.first { $0 == 7 }

يتوقف first(where:) عند أول عنصر مطابق، ولا ينشئ مصفوفة وسيطة. يبقى التعقيد O(n) في أسوأ الحالات، لكن عدد المقارنات يتوقف على مكان العنصر المطلوب. أما filter فيمر على المجموعة كاملة في كل مرة.

الترتيب بأكثر من مفتاح

لنفترض أنك ترتب جهات الاتصال بحسب اسم العائلة، ثم الاسم الأول عند تطابق اسم العائلة. يمكن كتابة المقارنة هكذا:

if lhs.surname != rhs.surname {
  return lhs.surname < rhs.surname
}
return lhs.name < rhs.name

توفر Swift مقارنة ترتيبية للصفوف (tuples) في هذا المثال: تقارن العنصر الأول، ثم تنتقل إلى الثاني إذا تساوى الأولان. هذا يختصر الشيفرة إلى:

extension Person: Comparable {
  static func < (lhs: Person, rhs: Person) -> Bool {
    (lhs.surname, lhs.name) < (rhs.surname, rhs.name)
  }
}

لإضافة معيار ثالث للترتيب، أضف العنصر المقابل إلى الصفين. تبقى معايير الترتيب متجاورة ويسهل التأكد من تطابق الطرفين.

التحقق من وجود الفهرس

if index >= 0 && index < items.count {

يفترض هذا الشرط أن الفهارس تبدأ من الصفر. يصح ذلك في Array، لكن ArraySlice تحتفظ بفهارس المصفوفة الأصلية. يمكن اختصار الشرط باستخدام معامل مطابقة الأنماط ~=، وهو المستخدم في switch مع أنماط مثل case 0..<10:

if 0..<items.count ~= index {

لكن الاختصار يحتفظ بافتراض البداية من الصفر. استخدم فهارس المجموعة نفسها كي يعمل الفحص مع الشريحة أيضًا:

if items.indices.contains(index) {

في الحالات الثلاث، تسمّي الصيغة الأقصر العملية المطلوبة بوضوح، وتقلل التفاصيل التي تحتاج إلى مراجعتها بنفسك.

ما الدالة التي اكتشفتها في المكتبة القياسية بعدما كتبت حلًا أطول بنفسك؟ أرسلها لي. وشارك هذه الأمثلة مع مطوّر Swift؛ ربما تكون لديه إضافة نستفيد منها.

المواضيع