نکته ای که لازمه قبل از این مقاله بهش اشاره کنم این است که برای خواندن این مقاله بهتر هست قبلا این مقاله ها را خوانده باشید:
حالا با مفهوم Protocol شروع میکنیم.
protocol در واقع یک چارچوب یا مجموعه ای از قوانین است، در تعریف یک پروتکل یک Blueprint یا طرح کلی را تعریف میکنیم، و بعد این طرح کلی را به یک کلاس یا استراکچر میدهیم. حالا این کلاس و استراکچر ملزم به تبعیت از این طرح هستند.
برای این که بهتر درک کنید میخواهم یک مثال در دنیای واقعی برایتان بزنم.
مثال:
فرض کنید میخواهید به یک مهمانی بروید که پروتکل این مهمانی، این است که همه باید ماسک بزنند. حالا اگر شما بدون ماسک وارد این مهمانی شوید شما را از مهمانی خارج میکنند، و تا موقعی که این مهمانی protocol ماسک زدن را داشته باشد شما نمیتوانید بدون رعایت کردن قوانین وارد مهمانی شوید.
حالا protocol در سوئیفت هم تقریبا همین مفهوم را دارد. یعنی تعدادی متغیر و متود (تابع) را در یک protocol تعریف میکنیم. و از این به بعد هر کلاس یا استراکچری که این پروتکل را داشته باشد، ملزم است که این توابع یا متغیر ها را درون خود داشته باشد.
برای این کار از کلمه کلیدی protocol
استفاده میکنیم و درون آن متغیر و تابع ها را تعریف میکنیم.
protocol Battery {
var size: Int { get set }
var health: Int { get }
func performance()
}
نکته بسیار مهم:
حالا احتمالا یک سوال مهم برایتان ایجاد شده است.
get
وset
برای چی هستند؟
هر متغیری که در protocol تعریف میکنیم دو حالت میتواند داشته باشد:
get
: در این حالت شما هر کاری میتوانید با متغیر بکنید. تغییرش بدهید یا بصورت یک ثابت آن را تعریف کنید.get set
: در نگاه اول بنظر میرسد این مورد امکان بیشتری را به شما میدهد، اما در واقع این حالت، محدود شده حالت بالا است. وقتی شما set را هم قرار میدهید، یعنی دارید متغیر را قابل set شدن تعریف میکنید، در نتیجه نمیتوانید آن را بصورت یک ثابت (let
) تعریف کنید.برای این که یک کلاس را ملزم به پیروی از یک پروتکل کنیم، به این صورت عمل میکنیم.
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)")
}
}
get
تعریف کردیم که بتوانیم آن را ثابت تعریف کنیم. اما چون health باطری گوشی به مرور زمان تغییر میکند ما حق نداریم از ثابت ها استفاده کنیم، برای همین از get set
استفاده کردیم.حال میخواهیم مثالی بزنیم که از یک 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
}
}
توضیحات بیشتر: