آموزش و بررسی Protocol ها در سوئیفت

زمان مطالعه : ۴ دقیقه
آخرین بروزرسانی : ۰۷ اسفند ۱۴۰۰
مفهوم پروتکل در زبان برنامه نویسی سوئیفت

نکته ای که لازمه قبل از این مقاله بهش اشاره کنم این است که برای خواندن این مقاله بهتر هست قبلا این مقاله ها را خوانده باشید:

  1. کلاس ها
  2. استراکچر ها
  3. enum

حالا با مفهوم Protocol شروع میکنیم.

Protocol چیست؟

protocol در واقع یک چارچوب یا مجموعه ای از قوانین است، در تعریف یک پروتکل یک Blueprint یا طرح کلی را تعریف میکنیم، و بعد این طرح کلی را به یک کلاس یا استراکچر میدهیم. حالا این کلاس و استراکچر ملزم به تبعیت از این طرح هستند.

برای این که بهتر درک کنید میخواهم یک مثال در دنیای واقعی برایتان بزنم.

مثال:

فرض کنید میخواهید به یک مهمانی بروید که پروتکل این مهمانی، این است که همه باید ماسک بزنند. حالا اگر شما بدون ماسک وارد این مهمانی شوید شما را از مهمانی خارج میکنند، و تا موقعی که این مهمانی protocol ماسک زدن را داشته باشد شما نمیتوانید بدون رعایت کردن قوانین وارد مهمانی شوید.

حالا protocol در سوئیفت هم تقریبا همین مفهوم را دارد. یعنی تعدادی متغیر و متود (تابع) را در یک protocol تعریف میکنیم. و از این به بعد هر کلاس یا استراکچری که این پروتکل را داشته باشد، ملزم است که این توابع یا متغیر ها را درون خود داشته باشد.

توضیحات بیشتر:
  • همانطور که در مهمانی هر کس میتواند ماسکی با ویژگی های متفاوت بزند، در سوئیفت هم شما میتوانید متغیر ها و متود ها را با ویژگی های مختلفی درون کلاس ها قرار دهید. در واقع قانون این است که این متغیر یا متود حتما تعریف شوند اما جزعیاتش میتواند متفاوت باشد.

تعریف Protocol در Swift

برای این کار از کلمه کلیدی protocol استفاده میکنیم و درون آن متغیر و تابع ها را تعریف میکنیم.

protocol Battery {
    var size: Int { get set }
    var health: Int { get }
    func performance()
}

نکته بسیار مهم:

در داخل protocol امکان مقداری دهی متغیر ها، یا تعریف بدنه یک تابع را نداریم.

حالا احتمالا یک سوال مهم برایتان ایجاد شده است.

get وset برای چی هستند؟

مفهوم Get و Set در Protocol

هر متغیری که در protocol تعریف میکنیم دو حالت میتواند داشته باشد:

  1. get: در این حالت شما هر کاری میتوانید با متغیر بکنید. تغییرش بدهید یا بصورت یک ثابت آن را تعریف کنید.
  2. get set: در نگاه اول بنظر میرسد این مورد امکان بیشتری را به شما میدهد، اما در واقع این حالت، محدود شده حالت بالا است. وقتی شما set را هم قرار میدهید، یعنی دارید متغیر را قابل set شدن تعریف میکنید، در نتیجه نمیتوانید آن را بصورت یک ثابت (let) تعریف کنید.

استفاده از یک Protocol در Struct

برای این که یک کلاس را ملزم به پیروی از یک پروتکل کنیم، به این صورت عمل میکنیم.

protocol Battery {
    var size: Int { get }
    var health: Int { get set }
    func performance()
}
struct iPhone: Battery {
    var size: Int
    var health: Int
    var name: String
    func performance() {
        print("I have iPhone \(name) and size of battery is \(size)")
    }
}
توضیحات بیشتر:
  • در struct شما باید size و health و performance را حتما تعریف کنید. اما نوشتن name با توجه به نیاز struct شما است و اجباری نیست.
  • از آن جایی که سایز باطری یک آیفون ثابت است آن را بصورت get تعریف کردیم که بتوانیم آن را ثابت تعریف کنیم. اما چون health باطری گوشی به مرور زمان تغییر میکند ما حق نداریم از ثابت ها استفاده کنیم، برای همین از get set استفاده کردیم.

ترکیب استفاده از Protocol در Class و Struct

حال میخواهیم مثالی بزنیم که از یک protocol در چند جا استفاده کنیم

protocol Apple {
    var name: String { get }
    var price: Int { get set }
}
struct Mac: Apple {
    let name: String
    var price: Int
    var gpu: String
}
class iPad: Apple {
    let name: String
    var price: Int
    var simSupport: Bool
    init(name: String, price: Int, simSupport: Bool) {
        self.name = name
        self.price = price
        self.simSupport = simSupport
    }
}

توضیحات بیشتر:

  • چون اسم محصول همیشه ثابت است آن را بصورت get تعریف کردیم که بتوانیم آن را بصورت ثابت استفاده کنیم.
  • چون قیمت یک محصول به مرور زمان تغییر میکند، آن را بصورت get set تعریف کردیم که امکان تغییر داشته باشد. (البته بصورت get هم تعریف میکردیم با خطایی روبرو نمیشدیم.)
اگر این مباحث کمی برایتان گنگ است پیشنهاد میکنیم آموزش گام به گام سوئیفت را بصورت کاملا رایگان مطالعه کنید.

این مقاله در حال بروز رسانی است و در آینده نزدیک مباحث جدید تری اضافه میشود...
میلاد خط شب
میلاد خط شب
معتقدم هر آدمی میتواند در یک زمینه ای مفید و تاثیر گذار باشد و اصولا آدم "غیر مفید" نداریم. فقط کافی است به موقع و صحیح راهنمایی شود.
پاسخ دهید


برخی از افرادی که این مقاله را پسندیدند 🥰

47