بازدید: ١١١٣

بستارها (closures) در سوئیفت (آموزش Swift)

بازگشت به صفحه اصلی آموزش سوییفت (Swift)

بستارها (closures) در سوئیفت شبیه به توابعی هستند که همانند بلوکها سازماندهی شده اند و می توانید آنها را در هرجایی فراخوانی کنید همانند زبانهای برنامه نویسی C و Objective C. مراجع ثابتها و متغیرهایی که در درون توابع تعریف می شوند، در بستارها گرفته و ذخیره می شوند. توابع بعنوان caseهای خاص بستارها درنظر گرفته می شوند که به سه شکل زیر می باشند:

 

استفاده از بستارها در سوئیفت

 

نحوه نوشتن یک بستار

 

در زیر می توانید نحوه نوشتن و تعریف کلی یک بستار را مشاهده کنید که پارامترهایی را پذیرفته و داده ای را برمی گرداند:


استفاده از بستارها در سوئیفت

 

به مثال ساده زیر توجه کنید:


استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:


استفاده از بستارها در سوئیفت

 

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


استفاده از بستارها در سوئیفت

 

به مثال ساده زیر توجه کنید:


استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:


استفاده از بستارها در سوئیفت

 

دستورات در بستارها

 

توابع تودرتو روش مناسبی را برای نامگذاری و تعریف بلوکی از کدها ارائه می دهند. به جای نمایش کل نام و تعریف و معرفی تابع، ازساختارها ( Constructها) برای تفکیک توابع کوتاهتر استفاده می شود. نمایش تابع بصورت یک دستور خلاصه، تنها با استفاده از دستورات بستار امکان پذیر است.

 

برنامه ترتیب صعودی

 

برای مرتب سازی یک رشته در سوئیفت، از تابع رزور شده Sorted استفاده می شود که هم اکنون در کتابخانه استاندارد در دسترس می باشد. تابع مربوطه، رشته داده شده را به ترتیب صعودی مرتب می کند و اعضا را در یک آرایه جدید به همان اندازه و همان نوع داده ای که در آرایه قدیمی وجود داشت، برمی گرداند. آرایه قدیمی به همان ترتیب باقی می ماند.  دو آرگومان در درون تابع مرتب شده نمایش داده می شوند که عبارتند از:

1- مقادیری از نوع داده مشخص شده که بصورت آرایه نمایش داده می شوند

2- آرایه حاوی (Int ,Int) که یک مقدار بولین را بازمی گرداند (Bool). اگر آرایه به طور مناسبی مرتب شود یک مقدار صحیح(True) را برمیگرداند درغیراینصورت یک مقدار نادرست (False)را برمی گرداند.

یک تابع نرمال با ورودی رشته ای نوشته می شود و در تابع مرتب شده قرار داده می شود تا رشته های مرتب شده در آرایه جدید بدست آیند. به مثال زیر توجه کنید:

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

آرایه اولیه ای که باید برای icecream مرتب سازی شود بصورت "swift"  و " great" ارائه می شود. تابعی که آرایه را مرتب می کند بصورت نوع داده رشته ای تعریف می شود و نوع بازگشتی آن بصورت بولین می باشد. هردو رشته با هم مقایسه شده و به ترتیب صعودی مرتب می شوند و در آرایه جدیدی ذخیره می شوند. اگر مرتب سازی با موفقیت انجام شود، تابع ما یک مقدار صحیح (true) را برمی گرداند در غیراینصورت یک مقدار نادرست (False) را برمی گرداند.

برای نوشتن دستورات بستار از موارد زیر استفاده می شود:

پارامترهای ثابت

پارامترهای متغیر

پارامترهای ورودی/خروجی (inout)

دستورات بستار از مقادیر پیش فرض پشتیبانی نمی کنند. همچنین می توان از پارامترهای variodic و Tuples بعنوان انواع پارامترها و انواع مقادیر بازگشتی استفاده کرد.

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

پارامترها و تعریفات نوع بازگشتی که در دستورات تابع ذکر شدند می توانند با استفاده از تابع دستوری بستار درون برنامه ای (inline) و بااستفاده از کلمه کلیدی in نمایش داده شوند. در هنگام تعریف پارامتر و مقادیر بازگشتی از کلمه کلیدی In برای مشخص کردن بدنه بستار استفاده می شود.

 

مقادیر بازگشتی مجازی تک دستوری

 

در اینجا نوع تابع دومین آرگومان، بیانگر این مسئله است که مقدار بازگشتی بستار، بولین است. بعلت اینکه بدنه بستار حاوی تنها یک دستور (s1>S2)  می باشد و یک مقدار بولین را باز می گرداند، هیچ ابهامی وجود ندارد و کلمه کلیدی return می تواند حذف شود.

برای اینکه تنها یک دستور در یک عبارت دستوری بازگردانده شود، کلمه کلیدی return که مخصوص بستارها می باشد را از قسمت تعریف خود حذف می کند.

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

دستور فوق این نکته را مشخص می کند، در زمانی که string1  بزرگتر از string2 باشد، مقدار صحیح (true) را باز گرداند در غیراینصورت مقدار نادرست (false) را برگرداند. از اینرو دستور بازگشتی در اینجا حذف می شود.

 

بستارهایی از انواع داده های شناخته شده

 

جمع دو عدد را در نظر بگیرید. می دانیم که جمع یک نوع داده عدد صحیح را برمی گرداند. از اینرو بستارهایی با انواع داده های شناخته شده  بصورت زیر معرفی و تعریف می شوند:

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

معرفی مختصر اسامی آرگومانها بعنوان بستارها

 

سوئیفت بطورخودکار امکان مختصر کردن اسامی آرگومانها را در درون بستارها فراهم می آورد که از آنها می توان برای مراجعه به آرگوماتهای بستار بصورت اسامی $0، $1، $2 و الی آخر استفاده کرد.

 

استفاده از بستارها در سوئیفت

 

در اینجا $0 و $1 به اولین و دومین آرگومان رشته ای بستار مراجعه می کند. وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

سوئیفت این امکان را برای کاربر فراهم آورده تا به راحتی بستارهای Inline (درون برنامه ای) را بصورت اسامی مختصر آرگومانی نمایش دهد. برای این منظور از $0، $1، $2 و .....$n استفاده می شود.

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

 

استفاده از بستارها در توابع عملگر

 

سوئیفت روش آسانی برای دسترسی به اعضا ارائه می دهد. در این روش از توابع عملگر بعنوان بستارها استفاده می شود. در مثالهای قبلی از کلمه کلیدی Bool  استفاده شد تا مقدار True را در زمانی که رشته ها مساوی هستند و مقدار False را در زمانی که مساوی نیستند، برگرداند.

می توان با کمک تابع عملگر در بستارها، دستور ساده تری را نیز نوشت:

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

استفاده از بستارها بعنوان دنباله ها

 

آرگومان آخر تابع در یک دستور بستار با کمک بستارهای دنباله دار تعریف می شود. برای این منظور آنها را در خارج از تابع و با استفاده از یک جفت آکولاد {} می نویسند. زمانی به استفاده از آن نیاز دارید که امکان نوشتن inline تابع در یک خط امکان پذیر نباشد.

 

استفاده از بستارها در سوئیفت

 

در اینجا {$0>$1} نمایانگر بستارهای دنباله داری هستند که بصورت خارجی (اسامی) تعریف شده اند.

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

گرفتن مقادیر و انواع مرجع ها

 

در سوئیفت مقادیر ثابت و متغیر به کمک بستارها گرفته می شوند. حتی به مقادیر متغیرها و ثابتها که در درون بدنه بستارها وجود دارند، مراجعه کرده و آنها را تغییر می دهد حتی اینکار را برای متغیرهایی که وجود ندارند نیز انجام می دهد.

با استفاده از تابع تودرتو مقادیر ثابت و متغیر گرفته می شوند. اینکار با نوشتن یک تابع در درون تابع دیگر انجام می شود.

یک تابع تودرتو مقادیر زیر را می گیرد:

  1. آرگومانهای خروجی تابع
  2. مقادیر ثابت و متغیری که در درون یک تابع خروجی تعریف شده اند

هنگامیکه در سوئیفت یک ثابت یا متغیر در درون یک تابع تعریف می شود، مراجعه به آن متغیرها بطورخودکار توسط بستارها انجام می شود. همچنین امکان رجوع به بیش از دومتغیر در یک بستار وجود دارد.

 

استفاده از بستارها در سوئیفت

 

در اینجا متغیرهای OneDecrement و Decrement هردو به یک بلوک حافظه بعنوان مرجع بستار اشاره دارند.

 

استفاده از بستارها در سوئیفت

 

وقتی برنامه فوق را با استفاده از Playground  اجرا می کنیم، نتایج زیر بدست می آیند:

 

استفاده از بستارها در سوئیفت

 

هرزمان که تابع خروجی calcDecrement فراخوانی می شود، از تابع decrementer() استفاده می کند و مقدار مربوطه را به اندازه 18 عدد کم می کند و با استفاده از تابع خروجی calcDecrement نتیجه را برمی گرداند. در اینجا calcDecrement همانند یک بستار عمل می کند.

حتی تابع decrementer()بطور پیش فرض هیچ آرگومان بستاری ندارد که با گرفتن مقادیر موجود، به متغیرهای overalldecrement و total رجوع کند. کپی مقادیر برای متغیرهای مشخص شده با کمک تابع جدید decrementer() ذخیره می شوند. سوئیفت از توابع مدیریتی حافظه نیز استفاده می کند بعنوان مثال در زمانی که از متغیرها استفاده نمی شود، فضای حافظه مورد نظر را بازمی گرداند.

 

بازگشت به صفحه اصلی آموزش سوییفت (Swift)

طراحی سایت و سئو توسط ضابط