آموزش برنامه نویسی سوئیفت (Swift): تبدیل نوع – بخش هشتم

۱۹۵ بازدید
آخرین به‌روزرسانی: ۰۹ مهر ۱۴۰۲
زمان مطالعه: ۱۴ دقیقه
آموزش برنامه نویسی سوئیفت (Swift): تبدیل نوع – بخش هشتم

در بخش قبلی از این سری مطالب آموزش زبان برنامه‌نویسی سوئیفت، به توضیح مقداردهی متغیرها و موارد مرتبط پرداختیم. در این بخش مفهوم تبدیل نوع به همراه باز کردن امن Optional-ها و کنترل دسترسی را مورد بررسی قرار خواهیم داد. به این منظور برخی از ابزارهایی که به طور مکرر در کدهای خود استفاده خواهیم کرد را معرفی می‌کنیم.

تبدیل نوع

تبدیل نوع درسوئیفت

در تصویر فوق یک «کرم پیله ساز» (Caterpillar) می‌بینید که پس از این که مدتی را در پیله گذراند به یک پروانه تبدیل خواهد شد. در واقع نوعی تبدیل نوع در این جا رخ می‌دهد. در برنامه‌نویسی نیز ما مفهومی به نام تبدیل نوع داریم که در آن، در صورتی که یک تبدیل معنادار باشد، می‌توان متغیری از یک نوع را به نوع دیگر تبدیل کرد.

به بیان ساده «تبدیل نوع» (Type Casting) به فرایند تبدیل یک متغیر از یک نوع به نوع دیگر گفته می‌شود. ما می‌توانیم تقریباً همه چیز را به نوع رشته تبدیل کنیم. با این که این کار در برخی موارد ممکن است معنی‌دار نباشد، اما در هر صورت ممکن است. روش انجام این کار را در مثال زیر ملاحظه می‌کنید.

1var someNumber: Int = 150
2var someString: String
3
4someString = String(describing: someNumber)
5
6// by using print() we actually perform type casting on integers
7print(someNumber)     // prints "150"
8// the result of print(someNumber) will look the same but it's a 
9// string

تبدیل نوع همچنین بر روی انواع Integer ،Double و Float نیز ممکن است:

1var someInteger = 4
2var someDouble: Double?
3
4someDouble = Double(someInteger)
5
6print(someDouble)     // prints "4.0"  (the .0 is because it was
7                      // previously a Double

مقادیر بازگشتی تبدیل نوع همیشه Optional هستند

زمانی که به تبدیل نوع Integer ،Double یا Float بدین روش می‌پردازیم، نتیجه کار به صورت پیش‌فرض یک Optional خواهد بود. دلیل این مسئله آن است که اگر تبدیل عملی نبود، باید مقدار nil بازگشت یابد. جهت اطمینان از این که یک تبدیل همواره کار می‌کند، باید از این رویه استفاده کنید. حتی زمانی که متغیری را اعلان کرده و بلافاصله آن را تبدیل نوع می‌کنید، هم استفاده از Optional-ها ضروری است.

حتی می‌توان تبدیل نوع را روی کلاس‌ها و Struct-ها نیز اجرا کرد؛ اما به جهت درک این مسئله ابتدا باید با تبدیل نوع در اشیا آشنا شویم:

1var integerValue = 42
2var stringValue = integerValue as? String

در ادامه ساختار جدید مطرح شده در کد فوق را مورد بررسی قرار داده و اتفاق‌هایی که در هر مرحله در برنامه رخ می‌دهد را توضیح می‌دهیم.

در خط نخست کد فوق، integerValue as به این معنی است که آماده تبدیل نوع این متغیر به یک نوع دیگر می‌شویم، علامت سؤال (?) به این معنی است این تبدیل از نوع Optional خواهد بود. در صورت موفقیت در تبدیل نوع، مقدار بازگشتی از نوعی خواهد بود که پس از علامت سؤال ذکر می‌شود و در غیر این صورت مقدار nil بازگشت می‌یابد. در نهایت عبارت String را داریم که نوعی است که برای تبدیل شدن متغیر تعیین شده است.

از آنجا که اعداد صحیح می‌توانند به رشته تبدیل شوند، اگر مقدار stringValue را نمایش دهیم با عبارت (Optional(42 مواجه می‌شویم. همان طور که قبلاً گفتیم این همان چیزی است که نمایش می‌یابد و ()Optional دقیقاً به ما اعلام می‌کند که مقدار درون پرانتزها مقداری است که فعلاً وجود دارد؛ اما می‌تواند پاک شود. نباید تلاش کنید از این مقدار به صورت مستقیم استفاده کنید؛ مگر این که تابعی که فراخوانی می‌کنید یک مقدار Optional را به عنوان پارامتر بپذیرد.

مثال‌هایی از تبدیل نوع

بنابراین ما می‌توانیم با این ساختار همه گونه تبدیل نوع را انجام دهیم. در ادامه برخی مثال‌های تبدیل نوع را بررسی می‌کنیم و اگر در این راستا عمل کنید با مشکلی مواجه نخواهید شد.

1var integerValue = 42
2var stringValue = String(describing: 42)
3
4var doubleValue = integerValue as! Double
5var floatValue = Int(stringValue) as? Float
6
7var array: [String] = ["eggs", "bacon", "ham", "cheese"]
8let arrayCount = Double(array.count as? String)
9
10var numArray: [Int] = [1, 2, 3, 4, 5]
11var anotherDouble = numArray[3] as? Double
12
13var isSunny = true
14var sunnyString = String(describing: isSunny)

همه تبدیل نوع‌هایی که در کد نمونه فوق ارائه شده‌اند، صحیح هستند؛ اما ممکن است برخی از آن‌ها معنی‌دار نباشد. با این که کاربرد عملی برخی از این موارد محدود است؛ اما در هر حال نمونه‌های خوبی از روش تبدیل انواع مختلف ارائه می‌کند که در زمان تبدیل قالب داده‌ها در کدنویسی به کار می‌آیند.

تبدیل نوع در کلاس

در مورد تبدیل نوع کلاس‌ها، در برخی موارد به چیزی بیش از آن چه پیاده‌سازی پیش‌فرض کلاس ارائه می‌کند، نیاز داریم. یک مثال که به طور مستقیم به برنامه‌نویسی iOS مرتبط است، UITableViewCells است. سلول نمای جدول پیش‌فرض را برای نمونه می‌توان در یک مخاطب در بخش مخاطبین گوشی تلفن همراه در حالی که هنوز روی آن کلیک نشده مشاهده کرد. در صورتی که این نوع از سلول نمای جدولی را انتخاب کنید، این سلول صرفاً شامل یک برچسب عنوان و یک عنوان فرعی خواهد بود. با این وجود، اگر به اپلیکیشن Contacts مراجعه کنید، می‌بینید که یک مکان برای تصور نیز دارد.

1class CustomTableViewCell: UITableViewCell {
2   @IBOutlet weak var imageView: UIImageView!
3   @IBOutlet weak var title: UILabel!
4   @IBOutlet weak var subtitle: UILabel!
5}
6
7class TableView: UITableView {
8    func tableView(_ tableView: UITableView,
9         cellForRowAt indexPath: IndexPath) -> UITableViewCell {
10          let cell = tableView.dequeueReusableCell(with: identifier)
11                as? CustomTableViewCell
12      
13          cell.imageView.image = UIImage(named: "myAwesomeImage")
14          cell.title.text = "My facinating title"
15          cell.subtitle.text = "My even better subtitle"
16      
17          return cell
18    }
19}

بنابراین اگر این مسئله موجب سردرگمی شما شده است، در برخی موارد کد می‌تواند سردرگم‌کننده باشد؛ اما تلاش کرده‌ایم تا این مثال را تا حد امکان ساده حفظ کنیم. بنابراین در ابتدا باید گفت که CustomTableViewCell یک کلاس است که ایجاد کرده‌ایم و از UITableViewCell که کلاس اپل است انشعاب یافته است.

UITableViewCell شامل همه منطق مورد نیاز برای نمایش آن سلول‌های نمای جدولی روی صفحه است. ما صرفاً از آن چه اپل قبلاً نوشته است استفاده می‌کنیم و سپس مشخصاتی را که می‌خواهیم در صفحه خود داشته باشیم، روی آن سوار می‌کنیم. از آنجا که اپل به ما یک UIImageView نداده است یا اساساً هیچ مکانی برای نمایش تصاویر نداریم، در ادامه تلاش می‌کنیم تا چنین چیزی را به کلاس خود اضافه کنیم؛ اما این کار را از طریق یک مالکیت ضعیف انجام می‌دهیم، زیرا این نما ممکن است پیش از آن که کلاس CustomTableViewCell مقدار زدایی (deinitialize) شود روی صفحه پنهان شود. می‌دانیم که باید تصویر و برچسب را با استفاده از عملگر (!) به اجبار باز کنیم؛ اما اپل قبلاً این کار را برای ما انجام داده است چون می‌داند که برچسب و تصویر پیش از آن که از آن‌ها استفاده کنیم مقداری دارند.

سازنده اینترفیس

شیء IBOutlet@ در حال حاضر اهمیت چندانی ندارد؛ اما اگر علاقه‌مندید معنی آن را بدانید باید گفت که IB اختصاری برای «سازنده اینترفیس» (Interface Builder) است. علامت @ در این عبارت صرفاً به این منظور است که مشخص شود از آن برای اینترفیس استفاده می‌شود و Outlet توضیح می‌دهد که این یک خروجی برای کدی است که با view کار می‌کند. یک هم‌نیا به نام IBAction@ نیز وجود دارد که برای قلاب کردن اعمال کاربران در کد استفاده می‌شود و به این ترتیب می‌توانیم تعامل کاربران را مدیریت کنیم.

در نیمه دوم مثال فوق نماهای با قابلیت استفاده مجدد را طرح‌بندی می‌کنیم؛ اما نمای پیش‌فرض با قابلیت استفاده مجدد از نوع UITableViewCell است. ما نماهای با استفاده مجدد UITableViewCell را نمی‌خواهیم، زیرا فاقد همه مشخصاتی است که برای نمایش سلول به همان شکل مورد انتظارمان نیاز داریم. بنابراین سلول را با استفاده از کد as? CustomTableViewCell تبدیل نوع می‌کنیم. بدین ترتیب می‌توانیم در ادامه کد مقادیری برای سلول کنونی تعیین کنیم که اینک به صورت CustomTableViewCell به همراه همه مشخصاتش نمایش می‌یابد.

این کاری که انجام دادیم به نام downcasting شناخته می‌شود. downcasting در مواردی استفاده می‌شود که یک تابع سوپرکلاس مورد استفاده قرار گیرد یا از یک مشخصه سوپرکلاس بهره گرفته شود. برای نمونه در مثال فوق، اگر cell.backgroundView فراخوانی می‌شد چنین حالتی رخ می‌داد. ما یک مشخصه از سوپرکلاس را مورد ارجاع قرار دادیم، زیرا backgroundView هرگز در کلاس theCustomTableViewCell مورد اشاره قرار نگرفته است.

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

Any و AnyObject

دو نوع دیگر نیز وجود دارند که در این مرحله باید با آن‌ها آشنا شوید و آن‌ها Any و AnyObject هستند. تفاوت بین این دو ساده است. Any می‌تواند برای نمایش هر مقداری به جز انواع تابع استفاده شود. AnyObject می‌تواند یک وهله از یک کلاس (String، Int، Float، Double ،lass و غیره) را نمایش دهد.

هنگامی که از Any و AnyObject استفاده می‌کنید، در موارد متعددی از تبدیل نوع بهره می‌گیرید. برخی موارد کاربری برای آن‌ها وجود دارند، اما هنگامی که با آن‌ها مواجه شوید، آن‌ها را خواهید شناخت. این نوع‌ها بیشتر برای ارسال پیام‌هایی به شیءهای دیگر در کد استفاده می‌شوند و از این رو در این مقاله بیش از این به آن‌ها نمی‌پردازیم.

باز کردن امن Optional-ها

هنگامی که با Optional-ها کار می‌کنیم همواره خواستار اجرای امن کد هستیم. منظور از امنیت در این جا آن است که نمی‌خواهیم با مقادیر تهی سر و کار داشته باشیم. در واقع می‌خواهیم مطمئن شویم که در هر مرحله که با مقداری سر و کار داریم، آن را به صورت دستی ایجاد نمی‌کنیم؛ در این حالت یا یک مقدار داریم و یا آن را به طور مناسبی مدیریت می‌کنیم.

چند روش برای «باز کردن» Optional-ها (unwrap) وجود دارد که نوع اول در کدهای سوئیفت رایج‌تر است:

  • if let
  • if var
  • guard let

if let

ابتدا انواع رایج‌تر و سپس انواع کمتر رایج را توضیح می‌دهیم. گزاره‌های if let جهت انتساب مقادیری به ثابت‌ها برای استفاده درون گزاره‌های if مورد استفاده قرار می‌گیرند:

1if let actualInteger = possibleInteger as? Int {
2    // do stuff with actual integer
3    print(actualInteger)    // prints 3
4    print(possibleInteger)  // prints Optional(3)
5    // actualInteger's scope ends here
6}

استفاده از if let به ما امکان می‌دهد که حالت Optional بودن را حذف کنیم و بدین ترتیب می‌توانیم از این مقدار به صورت یک مقدار واقعی استفاده کنیم. در مثال فوق، possibleInteger یک Int optional است که قبلاً در کد ارائه شده است. اگر بتوانیم possibleInteger را به صورت موفقی به Int تبدیل کنیم در این صورت if let مقدار را گرفته و آن را به actualInteger انتساب می‌دهد.

این کد معادل کد زیر است:

1let actualInteger = possibleInteger as! Int

به جز آن که actualInteger تنها در دامنه گزاره if let وجود دارد.

اینجا یک محدودیت وجود دارد، اگر نتوانیم possibleInteger را به یک Int تبدیل کنیم، در این صورت گزاره if به صورت False ارزیابی خواهد شد و کل بلوک کد اجرا نمی‌شود.

گزاره‌های if let می‌توانند جهت باز کردن مقادیر optional موجود بدون تغییر دادن نوع نیز استفاده شوند روش کار به صورت زیر است:

1if let actualDouble = possibleDouble {
2    // do stuff with actualDouble
3}

این وضعیت شبیه آن است که بگوییم اگر این گزاره عمل کرد، در این صورت کار خاصی را روی مقداری که از گزاره بازیابی کرده‌ایم، انجام بده.

guard

اما در مواردی که بخواهیم با آن مقدار کار کنیم و در عین حال مقدار مورد نظر ما درون یک گزاره if پیچیده نشده باشد، اپل یک راه‌حل به نام گزاره guard در اختیار ما قرار می‌دهد.

guard به عنوان یک محافظ برای تابع‌ها عمل می‌کند. اگر همه چیز درست باشد، امکان اجرای تابع با مقدار مورد نظر را می‌دهد و در غیر این صورت همه چیز تعطیل می‌شود.

بدین ترتیب یک تابع add داریم که دو Int Oprtinal به عنوان پارامتر می‌گیرد. نخستین چیزی که باید بررسی کنیم این است که آیا هر دو پارامتر مقدار دارند یا نه. اگر چنین باشد می‌دانیم که می‌توانیم به ادامه کار بپردازیم؛ اما اگر چنین نباشد باید همان جا از تابع خارج شویم و مقدار پیش‌فرض را بازگشت دهیم.

 چرا نباید در همه موارد از گزاره Guard استفاده کرد؟

پاسخ این سؤال آن است که در برخی موارد منطق دیگری وجود دارد که باید صرف نظر از این که چه مقادیری ارسال شده‌اند، اجرا شود.

به عنوان مثال فرض کنید روی یک کد شبکه کار می‌کنیم که در آن در برخی موارد باید یک هدر HTML در یک درخواست شبکه ارسال شود و در بعضی موارد نیز چنین چیزی مورد نیاز نیست. هدرها باید به صورت پارامتر اختیاری به تابعی ارسال شوند که درخواست را می‌فرستد. سپس در بدنه این تابع از یک if let استفاده می‌کنیم تا پارامترهای هدر را که ارسال شده‌اند بخوانیم. اگر یک مقدار بازگشت یابد، می‌دانیم که می‌توانیم چرخه‌ای روی هدرها تعریف کرده و آن را به درخواست خود اضافه کنیم. اما اگر چیزی بازگشت نیافت یا برای این درخواست مورد نیاز نبود، مشکل پیش نمی‌آید و صرفاً از بخش افزودن هدرها به درخواست، رد می‌شویم و درخواست را بدون هدر ارسال می‌کنیم.

به طور خلاصه در مواردی از if let استفاده می‌کنیم که نیاز است یک مقدار به صورت موقت باز شود یا یک مقدار برای ادامه کار مورد نیاز نیست. از guard در مواردی استفاده می‌کنیم که باید مقداری برای ادامه کار خود داشته باشیم.

نکته آخری که پیش از ادامه بحث باید در مورد if let گفته شود، این است که if let دقیقاً مانند یک گزاره if معمولی عمل می‌کند. ما می‌توانیم یک if let یا یک بند else داشته باشیم. بنابراین در مواردی که if let ابتدایی ناموفق بود، بدین معنی نیست که نمی‌توان else if let دیگری را مورد بررسی قرار داد.

if var

در نهایت گزینه if var را بررسی می‌کنیم. احتمالاً از قبل با این گزاره آشنایی دارید، اما اگر چنین نباشد نیز با توجه به توضیحاتی که در مورد if let دادیم، کارکرد if var باید برای شما روشن باشد. if var دقیقاً همان کاری را انجام می‌دهد که if let می‌کند، به جز این که یک متغیر و نه یک ثابت ایجاد می‌کند تا در بدنه گزاره if var مورد استفاده قرار دهید. حتی می‌توان هر دو مورد را در یک گزاره if با هم ترکیب کرد.

1if let acutualInteger = possibleInteger,
2   var actualString = possibleString {
3       // do stuff
4}

همچنین می‌توان چندین متغیر و ثابت را صرفاً با استفاده از کاما پس از هر ارزیابی، باز کرد. حتی می‌توان از آن روی همان مقدار استفاده کرد، زیرا متغیر اعلان شده و در زمانی که به کاما می‌رسد، مقداردهی نیز شده است.

1if let actualInteger = possibleInteger,
2   let actualDouble = actualInteger as? Double {
3       // do stuff with actualInteger
4       // or actualDouble
5}

تبدیل نوع در سوئیفت

کنترل دسترسی

در این بخش در مورد «پدیداری» (Visibility) کد و ارتباط آن با بقیه دنیای کدنویسی صحبت می‌کنیم. هر زمان که یک پروژه جدید ایجاد می‌کنید، در واقع در حال ایجاد یک ماژول هستید. هنگامی که از کد فرد دیگر به صورت یک فریمورک (یعنی ماژولی که می‌توان جهت بسط کارکردهای خود مورد استفاده قرار داد) استفاده می‌کنید، یک ماژول دیگر به کد خود اضافه می‌کنید. به طور پیش‌فرض کد نمی‌تواند از سوی ماژول مورد استفاده قرار گیرد و باید روزنه‌هایی در کد خود تعبیه کنید تا ماژول دیگر بتواند به کد شما دسترسی داشته باشد.

ترتیب چگونگی کپسوله‌سازی کد از محدودیت کم به زیاد به صورت زیر است:

  • همه
  • ماژول
  • فایل

در ادامه این موارد را توضیح می‌دهیم. پنج نوع دسترسی وجود دارد که می‌توان برای کلاس‌ها، struct-ها و enum-ها تعریف کرد. فهرست آن‌ها به ترتیب زیر است:

  • «دسترسی باز» (Open Access)
  • «دسترسی عمومی» (Public Access)
  • «دسترسی داخلی» (Internal Access) – سطح دسترسی پیش‌فرض
  • «دسترسی فایل-خصوصی» (File-Private)
  • «دسترسی خصوصی» (Private)
1public class myClass {
2  
3}
4// the public keyword defines the access control for this class

دسترسی داخلی

دسترسی داخلی سطح دسترسی پیش‌فرضی است که وقتی نوع کنترل دسترسی ذکر نشده باشد مورد استفاده قرار می‌گیرد. با این که نیازی به ذکر نوع internal پیش از اعلان کلاس وجود ندارد؛ اما در پروژه‌های بزرگ‌تر برای افزایش خوانایی کد، بهتر است دسترسی internal را پیش از اعلان کلاس ذکر کنیم.

سطح دسترسی داخلی به کلاس‌ها، struct-ها و enum-ها امکان می‌دهد که در همه جای ماژول که اعلان شده‌اند مورد استفاده قرار گیرند. این بدان معنی است که صرفاً در داخل کد شما global هستند. اگر ماژول دیگری به پروژه خود اضافه کنید و یا حتی خودتان یک ماژول جدید ایجاد کنید، این ماژول نخواهد توانست با چیزی که دسترسی داخلی دارد ارتباط بگیرد. از این مورد می‌توان برای ساخت زیرساخت درونی فریمورک استفاده کرد.

به بیان ساده‌تر، می‌توان از این سطح دسترسی در مواردی استفاده کرد که لازم نیست کس دیگری از کدهای ما استفاده کند.

دسترسی خصوصی

دسترسی خصوصی تنها امکان استفاده از یک نهاد (کلاس، struct یا enum) را در جایی که اعلان شده است می‌دهد. اگر یک متد را درون یک نهاد به صورت خصوصی اعلان کنید، تابع تنها می‌تواند از سوی خود نهاد فراخوانی شود و نمی‌توان از آن در نهاد دیگری استفاده کرد. اگر یک اکستنشن (در ادامه بیشتر توضیح می‌دهیم) از یک نهاد استفاده کنید، تنها در صورتی می‌تواند از متدهای خصوصی آن نهاد برای بسط دادن استفاده کند که در همان فایل قرار داشته باشد. در مورد اکستنشن‌ها در ادامه بیشتر توضیح خواهیم داد.

دسترسی فایل-خصوصی

دسترسی fileprivate در مواردی استفاده می‌شود که بخواهیم به یک نهاد اجازه بدهیم از سوی ماژول‌های دیگر در پروژه، مورد دسترسی قرار بگیرد. این وضعیت متفاوت از دسترسی خصوصی است چون در آن نهادهای دیگر که درون همان فایل به صورت fileprivate  تعریف شده‌اند، می‌توانند به متدهای آن دسترسی داشته باشند.

دسترسی عمومی

دسترسی Public زمانی استفاده می‌شود که می‌خواهیم یک نهاد در دسترس نهادهای دیگر که در همان فایل هستند، قرار داشته باشد. این وضعیت را می‌توان برای مثال مانند یک API برای کد تصور کرد. در این حالت ما به دیگران نمی‌گوییم که کارها را چگونه انجام می‌دهیم، اما به آن‌ها می‌گوییم که چگونه می‌توانند موارد مورد نظر خود را به دست بیاورند.

دسترسی باز

دسترسی باز یا Open Access تقریباً همان معادل دسترسی عمومی است به جز این که به ماژول‌های دیگر امکان می‌دهد تا از یک کلاس که به این صورت تعریف شده، کلاس‌های فرعی بسازند یا متدهای آن را Override کنند. اساساً بدین ترتیب به افراد دیگر امکان می‌دهیم که برای مثال به خودروی شما دسترسی یافته و ظاهر آن را تغییر دهند. بدین ترتیب ما اجازه انجام هر کاری را به افراد دیگر می‌دهیم. در مورد استفاده از این نوع دسترسی باید با احتیاط رفتار کرد، زیرا ممکن است ناخواسته منطق برنامه خود را در اختیار توسعه‌دهندگان دیگر قرار دهید. در ادامه انواع این دسترسی به کد را با مثالی از یک خودرو توضیح می‌دهیم.

دسترسی خصوصی را می‌توان به مواردی مانند پیستون خودرو تشبیه کرد. پیستون بخشی از موتور خودرو است که مخلوطی از هوا و سوخت (پارامترها) را می‌گیرد، آن‌ها را فشرده می‌کند (منطق) و عمل احتراق صورت می‌گیرد تا توان پیشرانش پدید آید (مقدار بازگشتی). دقت کنید که اگر هر یک از این مقادیر تهی باشند، خودرو متوقف می‌شود (برنامه از کار می‌افتد) از این رو باید آن‌ها را به صورت امن باز کنیم.

دسترسی فایل-خصوصی می‌تواند مانند شیلنگ بنزین خودرو باشد که از باک بنزین (تابعی که داده‌ها را از پایگاه داده می‌خواند) به موتور می‌رود و بنزین را داخل پیستون پمپ می‌کند. هر دو این بخش‌ها درون یک فایل تعریف شده‌اند و با یکدیگر همکاری دارند. آن‌ها به کمک دیگری نیاز ندارند و به همین ترتیب به خوبی عمل می‌کنند.

دسترسی داخلی مانند هر چیزی است که زیر کاپوت خودرو اتفاق می‌افتد. در عمل برای ما مهم نیست که خودرویمان ما را چگونه از نقطه‌ای به نقطه دیگر می‌برد، صرفاً می‌خواهیم که به مقصد برسیم.

دسترسی عمومی مانند استفاده از سوئیچ برای استارت زدن خودرو است. بدین ترتیب از پدال‌ها برای تنظیم سرعت و از چرخ‌ها برای شتاب گرفتن خودرو استفاده می‌شود. برای ما مهم نیست که خودرو عملاً چگونه حرکت می‌کند، ما صرفاً می‌دانیم که اگر تابع (stepOnTheGas(with: pressure را فراخوانی کنیم ماشین ما به راه می‌افتد و همین طور اگر تابع (stepOnTheBreak(with: pressure را فراخوانی کنیم خودرو متوقف خواهد شد.

دسترسی باز معادل این است که رادیوی فابریک خودرو را باز کنیم و یک رادیوی اسپورت روی آن ببندیم یا این که امکان توربوشارژ را روی موتور خودرو نصب کنیم.

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

جمع‌بندی

ما در این نوشته به معرفی مفاهیم تبدیل نوع پرداختیم و گفتیم که تبدیل نوع یک روش جالب برای تغییر دادن چیزی به چیز دیگر است که معنای بیشتر یا کمتری دارد. همچنین باز کردن امن Optional-ها را با سه روش جدید برای امن نگه‌داشتن کد معرفی کردیم. قویاً توصیه می‌کنیم که این موضوع را تمرین و آزمایش بکنید. در نهایت به بحث کنترل دسترسی و تأثیری که روی کارکردهای خصوصی یا عمومی‌تر کد در برابر دسترسی افراد دیگر دارد پرداختیم. این موضوع در مواردی که قصد دارید یک فریمورک بسازید بیشتر به کار می‌آید.

سخن پایانی

این مقاله احتمالاً یکی از دشوارترین بخش‌های این سری مطالب راهنمای آموزش زبان سوئیفت بوده است. ما در این نوشته تلاش کرده‌ایم مواردی را که در ادامه مورد نیاز خواهند بود ارائه کنیم و در عین حال تا حد امکان آن را ساده بیان کنیم.

در بخش بعدی به ارائه مفاهیم پروتکل‌ها، اکستنشن‌ها و Subscript-ها خواهیم پرداخت. Subscript را قبلاً دیده‌ایم؛ اما در بخش بعدی در مورد آن بیشتر توضیح خواهیم داد. همچنین در بخش بعدی به توضیح تفصیلی پروتکل‌ها پرداخته و مزیتی که هنگام استفاده از آن در کد شخصی یا هنگام کار تیمی به دست می‌آید را بررسی می‌کنیم. اکستنشن‌ها نیز کاملاً جذاب هستند، چون روشی عالی برای تقسیم بخش‌های طولانی کد به قسمت‌های با اندازه کوچک‌تر فراهم می‌سازند که درک آن‌ها ساده‌تر می‌سازد.

برای مطالعه بخش بعدی این مطلب، لطفاً به لینک زیر مراجعه کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
swift2go
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *