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

الدوال العامة

جزء من قسم البرمجة كائنية التوجه في رحلة 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
challenge icon

التحدي

سهل

اكتب الدالة العامة 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")
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift