الدوال العامة
جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 34 من 57.
تعمل الدالة العامة مع أي نوع. يشير العنصر النائب بين الأقواس الزاوية، وغالبًا ما يكون T، إلى النوع الذي يستخدمه المستدعي، وتملؤه Swift في كل استدعاء:
func firstAndLast<T>(_ items: [T]) -> [T] {
guard let first = items.first, let last = items.last else { return [] }
return [first, last]
}
print(firstAndLast([3, 8, 1]))
print(firstAndLast(["a", "b", "c"]))الناتج:
[3, 1]
["a", "c"]داخل الدالة لا يُعرف أي شيء عن T، لذا لا يُسمح إلا بالعمليات التي تعمل مع كل نوع. يتيح قيد مثل T: Comparable المزيد، وهنا يتيح عامل <:
func largest<T: Comparable>(_ items: [T]) -> T? {
guard var best = items.first else { return nil }
for item in items where item > best { best = item }
return best
}
print(largest([4, 9, 2])!)
print(largest(["pear", "apple", "zucchini"])!)الناتج:
9
zucchiniتحافظ الأنواع العامة على النوع الدقيق، بخلاف Any. نتيجة largest عند استخدامها مع [Int] هي Int?، لذا يمكن استخدامها في العمليات الحسابية من دون تحويل النوع:
func largest<T: Comparable>(_ items: [T]) -> T? {
items.max()
}
let top = largest([3, 7, 5]) ?? 0
print(top * 10)الناتج:
70يمكن أن تحتوي الدالة على عدة عناصر نائبة، ويمكن للقيود أن تسمّي بروتوكولات من إنشائك:
protocol Scored { var score: Int { get } }
struct Player: Scored { let name: String; let score: Int }
struct Team: Scored { let score: Int }
func total<T: Scored>(_ items: [T]) -> Int {
items.reduce(0) { $0 + $1.score }
}
func pair<A, B>(_ a: A, _ b: B) -> String { "\(a) & \(b)" }
print(total([Player(name: "a", score: 3), Player(name: "b", score: 4)]))
print(total([Team(score: 10)]))
print(pair(1, "one"))الناتج:
7
10
1 & oneالتحدي
سهلاكتب الدالة العامة countWhere(_:_:) التي تستقبل مصفوفة من أي نوع ومسندًا (T) -> Bool وتُرجع عدد العناصر التي تستوفي الشرط، والدالة mostCommon(_:) التي تستقبل مصفوفة من أي نوع Hashable وتُرجع العنصر الأكثر تكرارًا فيها (العنصر الذي يظهر أولًا في المصفوفة عند تعادل أعداد التكرار)، أو nil للمصفوفة الفارغة.
يقرأ الكود المزوَّد سطرًا من الكلمات المفصولة بفواصل وسطرًا من الأرقام. ويطبع عدد الكلمات التي يزيد طولها على 3 أحرف، والكلمة الأكثر شيوعًا، وعدد الأرقام الزوجية، والرقم الأكثر شيوعًا.
ضع كودك في Functions.swift. يحتوي main.swift على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.
جرّب بنفسك
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let words = input[0].split(separator: ",").map(String.init)
let numbers = input[1].split(separator: ",").map { Int($0)! }
print(countWhere(words) { $0.count > 3 })
print(mostCommon(words) ?? "none")
print(countWhere(numbers) { $0 % 2 == 0 })
print(mostCommon(numbers).map { String($0) } ?? "none")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift