Comparable
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 39 من 57.
Comparable تمنح النوع عوامل التشغيل < و<= و> و>=. أنت تطبّق < فقط؛ وتستنتج Swift الباقي. يمكن فرز الأنواع المتوافقة مع Comparable باستخدام sorted() واستخدامها مع min() وmax():
struct Version: Comparable {
let major: Int, minor: Int
static func < (lhs: Version, rhs: Version) -> Bool {
(lhs.major, lhs.minor) < (rhs.major, rhs.minor)
}
}
let versions = [Version(major: 2, minor: 1), Version(major: 1, minor: 9), Version(major: 2, minor: 0)]
let newest = versions.max()!
print("\(newest.major).\(newest.minor)")
print(versions.sorted().map { "\($0.major).\($0.minor)" })الناتج:
2.1
["1.9", "2.0", "2.1"]مقارنة الصفوف تقارن أجزاءها بالترتيب، مما يجعل المقارنات متعددة المفاتيح مختصرة. هنا ترتّب المهام حسب الأولوية أولًا ثم حسب الاسم:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool {
(lhs.priority, lhs.name) < (rhs.priority, rhs.name)
}
}
let tasks = [Task(priority: 2, name: "email"), Task(priority: 1, name: "fix"), Task(priority: 2, name: "call")]
print(tasks.sorted().map { $0.name })الناتج:
["fix", "call", "email"]يمكن للتعدادات التي لا تحتوي على قيم مرتبطة أن تتوافق مع Comparable من دون كتابة <: تتم مقارنة الحالات وفق ترتيب التصريح عنها:
enum Priority: Comparable {
case low, medium, high
}
print(Priority.low < Priority.high)
print([Priority.high, .low, .medium].sorted())الناتج:
true
[main.Priority.low, main.Priority.medium, main.Priority.high]تقوم sorted(by:) بالفرز باستخدام أي قاعدة لاستدعاء واحد، بينما تحدد Comparable الترتيب الطبيعي للنوع الذي تستخدمه sorted() وmin() وmax() في كل مكان:
struct Task: Comparable {
let priority: Int
let name: String
static func < (lhs: Task, rhs: Task) -> Bool { lhs.priority < rhs.priority }
}
let tasks = [Task(priority: 3, name: "c"), Task(priority: 1, name: "a")]
print(tasks.sorted().map { $0.name })
print(tasks.sorted(by: >).map { $0.name })الناتج:
["a", "c"]
["c", "a"]التحدي
سهلاجعل Runner (الاسم ووقت الإنهاء بصيغة minutes وseconds) متوافقًا مع Comparable، بحيث يكون الوقت الأسرع أصغر، وتُرتَّب الأوقات المتساوية حسب الاسم. أكمل podium(_:)، الذي يرتّب العدّائين باستخدام sorted() ويُرجع أسطرًا بالتنسيق 1. Ada 20:05 للعدّائين الثلاثة الأوائل (أو عددًا أقل إذا كان عدد العدّائين أقل)، مع تعبئة الثواني إلى خانتين.
يقرأ الكود المُ supplied الأسطر بالتنسيق name,mm:ss ويطبع كل سطر مُعاد.
ضع الكود الخاص بك في Runner.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج المُ supplied ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let runners = input.map { line -> Runner in
let p = line.split(separator: ",").map(String.init)
let t = p[1].split(separator: ":").map { Int($0)! }
return Runner(name: p[0], minutes: t[0], seconds: t[1])
}
for line in podium(runners) { print(line) }
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift