عبارات where في الدوال
أضف قيودًا دقيقة إلى الدوال العامة.
عبارات where في الدوال درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما بعد القيود البسيطة
يصف قيد مثل <T: Collection> النوع T نفسه. لكنكم تحتاجون أحيانًا إلى تقييد الأنواع المرتبطة بـ T، مثل Element الخاص به. وهذا ما تفعله جملة where.
func sumInts<C: Collection>(_ c: C) -> Int where C.Element == Int {
c.reduce(0, +)
}
print(sumInts([1, 2, 3]))متطلب تساوي النوع
يشترط where C.Element == Int أن تكون عناصر المجموعة من النوع Int تحديدًا، مما يتيح إجراء عمليات خاصة بالأعداد الصحيحة.
func describe<C: Collection>(_ c: C) -> String where C.Element == Int {
"Sum is " + String(c.reduce(0, +))
}
print(describe(Set([1, 2, 3])))متطلب بروتوكول على العنصر
يمكنكم اشتراط توافق العنصر مع بروتوكول بدلًا من اشتراط كونه من نوع محدد بعينه، وهذا أكثر مرونة.
func joinAll<C: Collection>(_ c: C) -> String
where C.Element: CustomStringConvertible {
c.map { $0.description }.joined(separator: ", ")
}
print(joinAll([1, 2, 3]))تأتي where بعد التوقيع
تقع جملة where بين النوع المرجع وجسم الدالة. وتعمل القيود الموجودة داخل <> وجملة where معًا.
func maxElement<C: Collection>(_ c: C) -> C.Element?
where C.Element: Comparable {
c.max()
}
print(maxElement([4, 9, 2])!)الربط بين معلمتي نوع
يمكن لجملة where ربط أنواع العناصر في نوعين عامين مختلفين باستخدام ==.
func combine<A: Collection, B: Collection>(_ a: A, _ b: B) -> [A.Element]
where A.Element == B.Element {
Array(a) + Array(b)
}
print(combine([1, 2], Set([3])))شروط where متعددة
اسردوا عدة متطلبات مفصولة بفواصل للتعبير عن قيود مركبة.
func report<C: Collection>(_ c: C)
where C.Element: Comparable, C.Element: CustomStringConvertible {
if let m = c.max() { print("max:", m.description) }
}
report([5, 1, 9])تقييد الأنواع المرتبطة المتداخلة
يمكنكم الوصول إلى مستويات أعمق، كاشتراط نوع عنصر العنصر، عند التعامل مع المجموعات المتداخلة.
func flatten<C: Collection>(_ c: C) -> [Int]
where C.Element: Collection, C.Element.Element == Int {
c.flatMap { Array($0) }
}
print(flatten([[1, 2], [3]]))where مع عناصر من النوع Equatable
يتيح اشتراط أن تكون العناصر من النوع Equatable البحث في مجموعة عامة.
func indexOf<C: Collection>(_ x: C.Element, in c: C) -> C.Index?
where C.Element: Equatable {
c.firstIndex(of: x)
}
if let i = indexOf(2, in: [1, 2, 3]) { print("found") }الأساليب العامة مع where
تستخدم الأساليب داخل الأنواع العامة where أيضًا، وغالبًا لإضافة سلوك لأنواع معينة من العناصر فقط.
struct Wrap<T> {
let items: [T]
func total() -> Int where T == Int { items.reduce(0, +) }
}
print(Wrap(items: [1, 2, 3]).total())فائدة سهولة القراءة
تُقرأ القيود المعقدة بوضوح أكبر داخل جملة where بدلًا من حشرها داخل الأقواس الزاوية، ولا سيما عند وجود عدة شروط للأنواع المرتبطة.
func first<C: Collection>(_ c: C) -> String
where C.Element: CustomStringConvertible {
c.first.map { $0.description } ?? "empty"
}
print(first([10, 20]))where في المكتبة القياسية
تستخدم أساليب مثل joined() في التسلسلات المكوّنة من تسلسلات جمل where داخليًا للتعبير عن متطلباتها بدقة.
let nested = [[1, 2], [3, 4]]
print(Array(nested.joined()))اختبار سريع
اختبروا مدى فهمكم لجمل where في الدوال.
مراجعة
تتيح جمل where تقييد الأنواع المرتبطة لنوع عام: فيمكنكم اشتراط أن يكون العنصر من نوع محدد (== Int)، أو أن يتوافق مع بروتوكول (: Comparable)، أو ربط عناصر معلمتي نوع، أو الوصول إلى الأنواع المرتبطة المتداخلة. وتأتي هذه الجمل بعد التوقيع وتحافظ على سهولة قراءة القيود المعقدة.
الأسئلة الشائعة
هل درس «عبارات where في الدوال» مجاني؟
نعم — نص درس «عبارات where في الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «عبارات where في الدوال»؟
أضف قيودًا دقيقة إلى الدوال العامة. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «عبارات where في الدوال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قيود معلمات النوع
- عبارات where في الدوال
- تقييد الأنواع المرتبطة
- الفهارس الفرعية والامتدادات العامة