البروتوكولات كعقود
حدّد عقود السلوك بصورة مستقلة عن الأنواع.
البروتوكولات كعقود درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
ما هو البروتوكول؟
يحدد البروتوكول مخططًا لأساليب وخصائص ومتطلبات أخرى يجب على النوع المتوافق معه تنفيذها. وهو بمثابة عقد: فأي نوع يتبنّاه يتعهد بتوفير كل ما يعلنه البروتوكول.
protocol Greetable {
var name: String { get }
func greet() -> String
}التوافق مع بروتوكول
يتوافق النوع مع البروتوكول من خلال تبنّيه وتوفير كل متطلباته. ويستوفي الهيكل هنا متطلبَي الخاصية name والأسلوب greet().
protocol Greetable {
var name: String { get }
func greet() -> String
}
struct Person: Greetable {
let name: String
func greet() -> String { "Hello, I am " + name }
}
let p = Person(name: "Ada")
print(p.greet())متطلبات الخصائص
تحدد البروتوكولات ما إذا كان يجب أن تكون الخاصية قابلة للقراءة ({ get }) أو قابلة للقراءة والكتابة معًا ({ get set }). ويمكن لخاصية مخزنة أو محسوبة استيفاء متطلب القراءة فقط.
protocol Identifiable {
var id: String { get }
}
struct User: Identifiable {
let id: String
}
print(User(id: "u-1").id)متطلبات الأساليب
تسرد متطلبات الأسلوب الاسم والمعاملات ونوع القيمة المُعادة، من دون جسم. وتوفر الأنواع المتوافقة التنفيذ.
protocol Shape {
func area() -> Double
}
struct Square: Shape {
let side: Double
func area() -> Double { side * side }
}
print(Square(side: 3).area())متطلبات mutating
بالنسبة إلى أنواع القيم، يجب وضع علامة mutating على الأساليب التي تغيّر self. صرّح بالمتطلب باستخدام mutating حتى تتمكن الهياكل من استيفائه.
protocol Toggleable {
mutating func toggle()
}
struct Switch: Toggleable {
var isOn = false
mutating func toggle() { isOn.toggle() }
}
var s = Switch()
s.toggle()
print(s.isOn)البروتوكولات بوصفها أنواعًا
البروتوكول نوع من الدرجة الأولى. ويمكنك استخدامه للمتغيرات والمعاملات والقيم المُعادة، مع قبول أي قيمة متوافقة معه.
protocol Animal { func sound() -> String }
struct Dog: Animal { func sound() -> String { "Woof" } }
struct Cat: Animal { func sound() -> String { "Meow" } }
let animals: [Animal] = [Dog(), Cat()]
for a in animals { print(a.sound()) }تعدد الأشكال عبر البروتوكولات
يُرسل استدعاء أسلوب بروتوكول إلى النوع الفعلي الكامن وراء القيمة. ويتيح لك ذلك كتابة تعليمات برمجية تعمل مع أنواع عديدة عبر عقد واحد.
protocol Describable { func describe() -> String }
struct Book: Describable { let t: String; func describe() -> String { "Book: " + t } }
struct Film: Describable { let t: String; func describe() -> String { "Film: " + t } }
func show(_ d: Describable) { print(d.describe()) }
show(Book(t: "Swift"))
show(Film(t: "Inception"))متطلبات المُهيئات
يمكن للبروتوكولات أن تتطلب مُهيئات. ويجب على الفئات وضع علامة required على التنفيذ حتى توفرها الفئات الفرعية أيضًا.
protocol FromInt {
init(value: Int)
}
struct Wrapper: FromInt {
let value: Int
init(value: Int) { self.value = value }
}
print(Wrapper(value: 42).value)وراثة البروتوكولات
يمكن لبروتوكول أن يرث من بروتوكول واحد أو أكثر، مضيفًا متطلبات إضافية إلى المتطلبات الموروثة.
protocol Named { var name: String { get } }
protocol Aged: Named { var age: Int { get } }
struct Member: Aged {
let name: String
let age: Int
}
let m = Member(name: "Lin", age: 30)
print(m.name, m.age)بروتوكولات مخصصة للفئات فقط
ضع علامة AnyObject على البروتوكول لقصر التوافق معه على الفئات، وهو أمر مفيد للمتطلبات ذات دلالات المرجع، مثل التفويض.
protocol Counter: AnyObject {
var count: Int { get set }
}
class Box: Counter {
var count = 0
}
let b = Box()
b.count = 5
print(b.count)التحقق من التوافق
استخدم is وas? لاختبار توافق قيمة مع بروتوكول في وقت التشغيل.
protocol Flyer { func fly() }
struct Bird: Flyer { func fly() { print("flap") } }
struct Rock {}
let things: [Any] = [Bird(), Rock()]
for t in things {
if let f = t as? Flyer { f.fly() } else { print("grounded") }
}تحقق سريع
اختبر فهمك لمتطلبات البروتوكولات.
مراجعة
تعلمت أن البروتوكول عقد: فهو يعلن متطلبات الخصائص والأساليب وmutating والمُهيئات من دون تنفيذات. وتتوافق الأنواع معه من خلال استيفاء كل متطلب، ويمكن استخدام البروتوكولات بوصفها أنواعًا لتحقيق تعدد الأشكال، كما يمكنها وراثة بروتوكولات أخرى وقصر التوافق معها على الفئات باستخدام AnyObject.
الأسئلة الشائعة
هل درس «البروتوكولات كعقود» مجاني؟
نعم — نص درس «البروتوكولات كعقود» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «البروتوكولات كعقود»؟
حدّد عقود السلوك بصورة مستقلة عن الأنواع. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «البروتوكولات كعقود»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- البروتوكولات كعقود
- التنفيذات الافتراضية في الامتدادات
- تركيب البروتوكولات
- المطابقة الشرطية