Professional Documents
Culture Documents
Swift Be Zaban Sade
Swift Be Zaban Sade
این اثر رایگان بوده و هرگونه استفاده تجاری از آن پیگرد قانونی دارد.
استفاده از مطالب آن ،بدون ذکر منبع ،غیراخالقی و غیرقانونی است.
توضیحات 18........................................................................................................................................................................
18....................................................................................................................................................................... متغیر
انواع داده 19 ....................................................................................................................................................................
51.......................................................................................................................................................................... تکرار
حلقه 52 ................................................................................................................................................................ While
Swiftچیست
Swiftیک زبان برنامه نویسی جدید است که برای توسعه برنامههای Mac OS ،iOSو توسعه لینوکس ،توسط Chris Lattnerبا
همکاری دیگر برنامه نویسان شرکت اپل در سال 2010ایجاد شد و جایگزینی برای زبان Objective-Cاست ،که زبان توصیه شده و
نام ، Swiftبر گرفته از نام یکی از سریعترین پرندگان است .این زبان به عنوان یک جایگزین سریع ،برای Objective-Cتوسعه یافت.
به غیر از سرعت Swift ،مزایای دیگری نسبت به Objective-Cدارد ،که از آن جمله میتوان به سهولت یادگیری ،ایمنی ،نیاز به کد
در مقایسه با Swift ،Objective-Cدارای یک دستور زبان سادهتر است که برای مبتدیان یا کسانی که با زبانهای برنامه نویسی دیگر
کار کردهاند ،یادگیری آن را راحت تر میکند .این زبان را میتوان ،تلفیقی از زبانهای Python ،Ruby ،Rust ،C#و طیف وسیعی از
زبانهای برنامه نویسی دیگر دانست .این بدان معنی است که برنامه نویسانی که قبالً با زبانهای دیگر کار کردهاند ،مفاهیم زیادی در
Swiftپیدا میکنند ،که شبیه مفاهیمی است که قبالً در زبانهایی که کار کردهاند ،با آنها مواجه شدهاند.
Swiftهنوز یک زبان برنامه نویسی جدید است اما محبوبیت و پذیرش آن نسب به سایر زبانهای برنامه نویسی سرعت بیشتری داشته
است .اکنون این زبان محبوبترین زبان برای توسعه دستگاههای اپل است .تاکنون نسخههای مختلفی از این زبان ارائه شده است که
کدهای Swiftدر سیستم عامل Macقابل اجرا هستند .برای کدنویسی هم به یک ویرایشگر متن به نام XCodeاحتیاج داریم ،که
باید آن را در سیستم عامل Macنصب کنیم .پس کسانی که از سیستم عامل Macو محیط کدنویسی XCodeاستفاده میکنند،
این درس برای کسانی است که به یادگیری زبان برنامه نویسی Swiftعالقه دارند و میخواهند از سیستم عامل ویندوز و ویرایشگر متن
NotePadبرای یادگیری این زبان استفاده کنند .این دسته از دوستان عزیز باید کامپایلر زبان Swiftرا در سیستم عامل ویندوز خود نصب
کرده و شروع به کدنویسی کنند .برای کدنویسی ،Swiftعالوه بر NotePadویندوز ،ویرایشگرهای حرفهای دیگر از جمله VS Codeهم
وجود دارند که کار کدنویسی را راحتتر میکنند .ولی ما در این آموزشها بنا را بر راحتترین حالت ممکن ،گذاشتهایم.
روش دیگر اجرای کدهای Swiftدر سیستم عامل ویندوز ،نصب سیستم عامل Macدر ویندوز است که این کار توسط نرم افزاری به نام
VMWare Work Stationانجام میشود .البته این روش را توصیه نمیکنیم .چون نصب Macبر روی سیستم عامل ویندوز ،مستلزم
داشتن یک سیستم قوی از لحاظ حافظه رم و هارد باال و همچنین CPUهای چند هستهای میباشد .برای اجرای کدهای Swiftدر
ویندوز ،شما به کامپایلر Swiftنیاز دارید که در لینک زیر میتوانید آن را دانلود کنید:
http://dl.w3-farsi.com/Software/Swift/SwiftForWindows-2.0.exe
پس از دانلود فایل باال و دوبار کلیک بر روی آن ،پنجرهای به صورت زیر باز میشود که با کلیک بر روی دکمههای I Agree، Install
بعد از زدن دکمه finishدر صفحه باال ،صفحه اصلی برنامه به صورت زیر باز شده و شما میتوانید کدنویسی را شروع کنید:
9 مبانی زبان Swift
دستور زبان یک برنامه ساده Swiftرا توضیح دهم .قبل از ایجاد برنامه به این نکته خیلی مهم توجه کنید:
در نوشتن این برنامه و برنامههای آتی ،به حروف بزرگ و کوچک ،توجه کنید .چون Swiftبه بزرگ و کوچک بودن حروف حساس
است.
یکی از تنظیماتی که قبل از شروع این درس توصیه میکنیم که اعمال کنید این است که پسوند فایلها داخل ویندوز را قابل مشاهده
کنید .برای این کار به My Computerرفته و به صورت زیر از منوی Organizeگزینه Folder and search optionsرا بزنید:
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 10
از پنجره باز شده به صورت زیر به سربرگ Viewرفته و تیک کنار گزینه Hide Extension for khnown file typesرا بردارید:
11 مبانی زبان Swift
در ادامه شما را نحوه ایجاد اولین برنامه در Swiftرا توضیح میدهیم .همانطور که گفته شد ،شما برای کامپایل و اجرای برنامههای
Swiftبه کامپایلر این زبان نیاز دارید ،که آن را در درس قبل نصب کردیم و االن فرض میکنیم که شما هیچ IDEیا محیط کدنویسی در
اختیار ندارید و میخواهید یک برنامه Swiftبنویسید .در این برنامه میخواهیم پیغام Welcome to Swift Tutorialsچاپ شود.
ابتدا یک ویرایشگر متن مانند Notepadرا باز کرده و کدهای زیر را در داخل آن نوشته (حروف بزرگ و کوچک را رعایت کنید) و با پسوند
همانطور که مشاهده میکنید ،بعد از ذخیره ،فایل با پسوند MyFirstProgram.swift.txtذخیره میشود که شما باید پسوند .txt
آن را حذف کنید .هنگام پاک کردن پسوند ،پیغامی به صورت زیر ظاهر میشود که شما باید بر روی گزینه Yesکلیک کنید:
حال نوبت به اجرای برنامه میرسد .برنامه Swift For Windowsرا اجرا میکنیم .در صفحه زیر بر روی گزینه Select Fileکلیک
بعد از انتخاب فایل بر روی دکمه Compileکلیک کرده و صبر میکنیم تا پیغام Successfully compiledنمایش داده شود:
در نهایت بعد از کلیک بر روی دکمه Runبرنامه اجرا شده و پیغام نمایش ! Welcome to Swift Tutorialsداده میشود:
15 مبانی زبان Swift
مثال باال سادهترین برنامهای است که شما میتوانید در Swiftبنویسید .هدف در مثال باال نمایش یک پیغام در صفحه نمایش است.
هر زبان برنامه نویسی دارای قواعدی برای کدنویسی است Swift .دارای توابع از پیش تعریف شدهای است که هر کدام برای مقاصد
خاصی به کار میروند .هر چند که در آینده در مورد توابع بیشتر توضیح میدهیم ،ولی در همین حد به توضیح تابع بسنده میکنیم که
توابع مجموعهای از کدها هستند که دارای یک نام بوده و در جلوی نام آنها عالمت () قرار میگیرد .یکی از این توابع ،تابع )(print
است.
از تابع )( printبرای چاپ یک رشته استفاده میشود .یک رشته گروهی از کاراکترها است ،که به وسیله دابل کوتیشن (“) محصور شده
است .مانند :“!Welcome to Swift Tutorials”.یک کاراکتر میتواند یک حرف ،عدد ،عالمت یا … باشد .در کل مثال باال نحوه
استفاده از تابع )( printاست .توضیحات بیشتر در درسهای آینده آمده است Swift .فضاهای خالی را نادیده میگیرد .مثالً از کد
(print
)"!"Welcome to Swift Tutorials
همیشه به یاد داشته باشید که Swiftبه بزرگی و کوچکی حروف حساس است .یعنی به طور مثال MANو manدر Swiftبا هم فرق
دارند .رشتهها و توضیحات از این قاعده مستثنی هستند که در درسهای آینده توضیح خواهیم داد .مثالً کدهای زیر با خطا مواجه
تغییر در بزرگی و کوچکی حروف از اجرای کدها جلوگیری میکند .اما کد زیر کامالً بدون خطا است:
کاراکترهای کنترلی
کاراکترهای کنترلی کاراکترهای ترکیبی هستند که با یک بک اسلش )\( شروع میشوند و به دنبال آنها یک حرف یا عدد میآید و یک
رشته را با فرمت خاص نمایش میدهند .برای مثال برای ایجاد یک خط جدید و قرار دادن رشته در آن میتوان از کاراکتر کنترلی \n
)"!print("Hello\nWorld
Hello
World
مشاهده کردید که کامپایلر بعد از مواجهه با کاراکتر کنترلی \nنشانگر ماوس را به خط بعد برده و بقیه رشته را در خط بعد نمایش
میدهد .جدول زیر لیست کاراکترهای کنترلی و کارکرد آنها را نشان میدهد :
ما برای استفاده از کاراکترهای کنترلی از بک اسلش )\( استفاده میکنیم .از آنجاییکه \ معنای خاصی به رشتهها میدهد برای چاپ بک
یکی از موارد استفاده از \\ ،نشان دادن مسیر یک فایل در Macاست :
از آنجاییکه از دابل کوتیشن )“( برای نشان دادن رشتهها استفاده میکنیم برای چاپ آن از ”\ استفاده میکنیم :
)"print("Left\tRight
Left Right
هر تعداد کاراکتر که بعد از کاراکتر کنترلی \rبیایند به اول سطر منتقل و جایگزین کاراکترهای موجود میشوند :
)"print("Mitten\rK
Kitten
مثالً در مثال باال کاراکتر Kبعد از کاراکتر کنترلی \rآمده است .کاراکتر کنترلی حرف Kرا به ابتدای سطر برده و جایگزین حرف Mمیکند.
برای چاپ کاراکترهای یونیکد میتوان از \uاستفاده کرد .برای استفاده از ،\uمقدار در مبنای 16کاراکتر را درست بعد از عالمت \uو در
داخل دو عالمت {} قرار میدهیم .برای مثال اگر بخواهیم عالمت کپی رایت )©( را چاپ کنیم ،باید بعد از عالمت \uمقدار A900را قرار
)"}print("\u{00A9
©
برای مشاهده لیست مقادیر مبنای 16برای کاراکترهای یونیکد به لینک زیر مراجعه نمایید :
http://www.ascii.cl/htmlcodes.htm
اگر کامپایلر به یک کاراکتر کنترلی غیر مجاز برخورد کند ،برنامه پیغام خطا میدهد .بیشترین خطا زمانی اتفاق می افتد که برنامه نویس
برای چاپ اسلش )\( از \\ استفاده میکند .برای دریافت اطالعات بیشتر در مورد کاراکترهای کنترلی به لینک زیر مراجعه کنید :
https://msdn.microsoft.com/en-us/library/h21280bw.aspx
توضیحات
وقتی که کدی تایپ می کنید شاید بخواهید که متنی جهت یادآوری وظیفه آن کد به آن اضافه کنید .در ( Swiftو بیشتر زبانهای برنامه
نویسی) می توان این کار را با استفاده از توضیحات انجام داد .توضیحات متونی هستند که توسط کامپایلر نادیده گرفته می شوند و به
هدف اصلی از ایجاد توضیحات ،باال بردن خوانایی و تشخیص نقش کدهای نوشته شده توسط شما ،برای دیگران است .فرض کنید که
می خواهید در مورد یک کد خاص ،توضیح بدهید ،می توانید توضیحات را در باالی کد یا کنار آن بنویسید .از توضیحات برای مستند
سازی برنامه هم استفاده می شود .در برنامه زیر نقش توضیحات نشان داده شده است:
خط اول کد باال یک توضیح درباره خط دوم است که به کاربر اعالم می کند که وظیفه خط دوم چیست ؟ با اجرای کد باال فقط جمله
Hello Worldچاپ شده و خط اول در خروجی نمایش داده نمی شود چون کامپایلر توضیحات را نادیده می گیرد .همانطور که مشاهده
می کنید برای درج توضیحات در Swiftاز عالمت //استفاده می شود .اگر توضیح درباره یک کد به بیش از یک خط نیاز باشد از
توضیحات چند خطی استفاده میشود .توضیحات چند خطی با * /شروع و با */پایان مییابند .هر نوشتهای که بین این دو عالمت قرار
متغیر
متغیر مکانی از حافظه است که شما میتوانید مقادیری را در آن ذخیره کنید .میتوان آن را به عنوان یک ظرف تصور کرد که دادههای
خود را در آن قرار دادهاید .محتویات این ظرف میتواند پاک شود یا تغییر کند .هر متغیر دارای یک نام نیز هست .که از طریق آن میتوان
متغیر را از دیگر متغیرها تشخیص داد و به مقدار آن دسترسی پیدا کرد .همچنین دارای یک مقدار میباشد که میتواند توسط کاربر
انتخاب شده باشد یا نتیجه یک محاسبه باشد .مقدار متغیر میتواند تهی نیز باشد .متغیر دارای نوع نیز هست بدین معنی که نوع آن با
متغیر دارای عمر نیز هست که از روی آن میتوان تشخیص داد که متغیر باید چقدر در طول برنامه مورد استفاده قرار گیرد .و در نهایت
متغیر دارای محدوده استفاده نیز هست که به شما میگوید که متغیر در چه جای برنامه برای شما قابل دسترسی است .ما از متغیرها به
عنوان یک انبار موقتی برای ذخیره داده استفاده میکنیم .هنگامی که یک برنامه ایجاد میکنیم احتیاج به یک مکان برای ذخیره داده،
مقادیر یا دادههایی که توسط کاربر وارد میشوند ،داریم .این مکان ،همان متغیر است.
برای این از کلمه متغیر استفاده میشود چون ما میتوانیم بسته به نوع شرایط هر جا که الزم باشد ،مقدار آن را تغییر دهیم .متغیرها
موقتی هستند و فقط موقعی مورد استفاده قرار میگیرند که برنامه در حال اجراست و وقتی شما برنامه را میبندید محتویات متغیرها نیز
19 مبانی زبان Swift
پاک میشود .قبالً ذکر شد که به وسیله نام متغیر میتوان به آن دسترسی پیدا کرد .برای نامگذاری متغیرها باید قوانین زیر را رعایت کرد
:
نام متغیر باید با یکی از حروف الفبا ) (a-z or A-Zیا عالمت _ شروع شود.
نمیتوان از کلمات رزرو شده در Swiftبرای نام متغیر استفاده کرد.
اسامی متغیرها نسبت به بزرگی و کوچکی حروف حساس هستند .در Swiftدو حرف مانند aو Aدو کاراکتر مختلف به
حساب میآیند.
دو متغیر با نامهای myNumberو MyNumberدو متغیر مختلف محسوب میشوند چون یکی از آنها با حرف کوچک mو دیگری با حرف
بزرگ Mشروع میشود .متغیر دارای نوع هست که نوع دادهای را که در خود ذخیره میکند را نشان میدهد .در درس بعد در مورد انواع
داده ها در Swiftتوضیح می دهیم .لیست کلمات کلیدی ،Swiftکه نباید از آنها در نامگذاری متغیرها استفاده کرد در زیر آمده است:
انواع داده
متغیرها در Swiftمیتوانند انواع مختلف داده را در خود ذخیره کنند .این دادهها دارای مجموعه مشخصی از مقادیر شامل اعداد،
کاراکترها و یا مقادیر بولی هستند .در جدول زیر انواع داده و محدوده آنها آمده است :
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 20
برای به خاطر سپردن دو نوع Floatو Doubleدر جدول باال ،باید از نماد علمی استفاده شود .انواع ساده دیگری که از آنها برای ذخیره
دادههای غیر عددی و پیچیده تر استفاده می شود و در جدول زیر نمایش داده شدهاند :
توضیح نوع
استفاده از متغیرها
در مثال زیر نحوه تعریف و مقدار دهی متغیرها نمایش داده شده است :
تعریف متغیر
برای تعریف متغیر از دو کلمه varبه صورت زیر استفاده میشود:
varیک کلمه کلیدی identifier ،نام و typeنوع متغیر است .در این روش ما صراحتاً نوع متغیر را ذکر میکنیم .توجه کنید که قبل
از نوع متغیر باید عالمت :را قرار دهید .یک روش دیگر هم برای تعریف متغیر وجود دارد و آن این است که نوع متغیر را صراحتا اعالم
نکنیم :
ً
فورا بعد از عالمت مساوی مقدار متغیر را هم بنویسیم ،تا کامپایلر به صورت خودکار و با توجه به مقدار نوع متغیر را در روش باال ،باید
تشخیص دهد ولی در روش اول همانطور که در کد ابتدای درس میبینیم ،ما اول متغیرها را در خطوط 2-7تعریف و سپس در خطوط
10-15مقداردهی کردهایم .پس خطوط 8-21کد باال را میتوان به صورت زیر هم خالصه کرد:
تعریف متغیر با مقدار دهی متغیرها متفاوت است .تعریف متغیر یعنی انتخاب نوع و نام برای متغیر (خطوط )2-7ولی مقدار دهی یعنی
اختصاص یک مقدار به متغیر (خطوط .)10-15برای تعریف چند متغیر از یک نوع میتوان به صورت زیر عمل کرد :
مثال
در مثال باال 5متغیر از نوع صحیح و 3متغیر از نوع رشته تعریف شده است .توجه داشته باشید که بین متغیرها باید عالمت کاما (),
باشد .روش دیگر برای تعریف و مقداردهی چندین متغیر در یک خط ،چه از یک نوع باشند و چه نباشند ،به صورت زیر است:
در این روش نوع آنها را مشخص نمی کنیم تا کامپایلر نوع متغیرها را به صورت خودکار تشخیص دهد.
نامگذاری متغیرها
نام متغیر باید با یک حرف یا زیرخط و به دنبال آن حرف یا عدد شروع شود.
نمیتوان از کاراکترهای خاص مانند &، %، #یا عدد برای شروع نام متغیر استفاده کرد مانند 2numbers.
نام متغیر نباید دارای فاصله باشد .برای نامهای چند حرفی میتوان به جای فاصله از عالمت زیرخط یا _ استفاده کرد.
اگر به نامهای مجاز در مثال باال توجه کنید متوجه قراردادهای به کار رفته در نامگذاری آنها خواهید شد .یکی از روشهای نامگذاری،
نامگذاری کوهان شتری است .در این روش که برای متغیرهای دو کلمهای به کار میرود ،اولین حرف اولین کلمه با حرف کوچک و اولین
حرف دومین کلمه با حرف بزرگ نمایش داده میشود مانند .myNumber:توجه کنید که اولین حرف کلمه Numberبا حرف بزرگ شروع
شده است .مثال دیگر کلمه numberOfStudentsاست .اگر توجه کنید ،بعد از اولین کلمه ،حرف اول سایر کلمات با حروف بزرگ نمایش
به خطوط 18-23کد باال ،توجه کنید .نام متغیرها در این خطوط در داخل )(\ نوشته شده است .وجود نام متغیرها در بین دو عالمت
پرانتز و بعد از عالمت \ بدین معناست که ما مقدار متغیر را می خواهیم .برای درک بهتر خطوط 18-23کد باال را به صورت زیر نوشته و
با اجرای برنامه ،نام متغیرها چاپ می شود نه مقدار آنها :
پس اگر مقدار یک متغیر را می خواهید چاپ کنید ،باید نام متغیر را در داخل ()\ بنویسید ،مانند ).\(num1
ثابت
ثابتها ،انواعی از متغیرها هستند که مقدار آنها در طول برنامه تغییر نمیکند .ثابتها حتماً باید مقدار دهی اولیه شوند و اگر مقدار دهی
آنها فراموش شود در برنامه خطا به وجود میآید .بعد از این که به ثابتها مقدار اولیه اختصاص داده شد هرگز در زمان اجرای برنامه
شروع می کنند تا تشخیص آنها در برنامه راحت باشد (ولی این یک قرارداد است و شما می توانید طبق قوانین نامگذاری متغیرها یک
نام برای ثابت تعریف کنید) .نحوه تعریف ثابت در زیر آمده است :
مثال :
در این مثال میبینید که مقدار دادن به یک ثابت ،که قبالً مقدار دهی شده برنامه را با خطا مواجه میکند .ممکن است این سؤال برایتان
پیش آمده باشد که دلیل استفاده از ثابتها چیست؟ اگر مطمئن هستید که مقادیری در برنامه وجود دارند که هرگز در طول برنامه تغییر
نمیکنند بهتر است که آنها را به صورت ثابت تعریف کنید .این کار هر چند کوچک کیفیت برنامه شما را باال میبرد.
از کالسهای از پیش تعریف شده است ،که میتوانند مقادیر را از یک نوع بـه نوع دیگر تبدیل کنند .در Swiftبر خالف بسیاری از
زبانهای برنامه نویسی ،تبدیل ضمنی وجود ندارد .یعنی یک نوع داده به طور خودکار به نوع دیگر تبدیل نمیشود .به کد زیر توجه کنید
:
در کد باال ،ما یک متغیر از نوع Doubleبه نام number1تعریف کرده و آن را با استفاده از عالمت = در داخل یک متغیر از نوع Intبه
نام number2قرار دادهایم .با این کار با از کامپایلر خواستهایم که یک نوع Doubleرا به نوع Intتبدیل کند .ولی کامپایلر Swiftاین
کار را انجام نمیدهد و برنامه با خطا مواجه میشود .برای انجام همچین کاری باید از تبدیل صریح استفاده کنیم که یک نوع تبدیل
اجباری بوده و کامپایلر را وادار به انجام میکند و نحوه انجام آن به صورت زیر است :
با توجه به کد باال ،اگر بخواهیم یک نوع Doubleرا به یک نوع Intتبدیل کنیم ،باید به صورت زیر عمل نماییم:
)print(number2
5
حال اگر برنامه را اجرا کنید با خطا مواجه نخواهید شد .به این نکته توجه کنید که در هنگام استفاده از تبدیل صریح ممکن است ،مقادیر
اصلی تغییر کنند .برای مثال ،وقتی که در کد باال ،یک عدد با ممیز اعشار مثالً از نوع Doubleرا به یک نوع Intتبدیل میکنیم ،مقدار
اعداد بعد از ممیز از بین میروند .خروجی کد باال عدد 5است چون نوع دادهای Intنمیتواند مقدار اعشار بگیرد .حالت دیگر را تصور
کنید .اگر شما بخواهید یک متغیر را که دارای مقداری بیشتر از محدوده متغیر مقصد هست تبدیل کنید ،چه اتفاقی می افتد؟ مانند تبدیل
زیر که میخواهیم متغیر number1را که دارای مقدار 300است را به نوع بایت تبدیل کنیم که محدود اعداد بین 0-255را پوشش
میدهد:
)print(number2
برنامه با خطا مواجه میشود .دلیل این امر این است که UInt8 ،فقط میتواند شامل اعداد 0تا 255باشد و نمیتواند مقدار 300را در
خود ذخیره کند .علت خطا به تعداد بیتها بستگی دارد .یک UInt8دارای 8بیت است درحالی که UInt32دارای 32بیت است.
300 = 00000000000000000000000100101100
= 255 11111111
خروجی باال نشان میدهد که بیشترین مقدار UInt8که عدد 255است ،میتواند فقط شامل 8بیت باشد ( )11111111بنابراین فقط
8بیت اول مقدار UInt32به متغیر UInt8انتقال مییابد و چون بقیه بیتها قابل انتقال نیستند با خطای Not enough bits to
represent a signed valueمواجه میشویم .میتوان با استفاده از Type Castingیا تبدیل صریح یک نوع رشتهای را هم به
)print(numberValue
300
به این نکته توجه کنید که در تبدیل یک نوع رشتهای به عددی باید بعد از پرانتز بسته از عالمت ! استفاده کنید .حال چطور بفهمیم که
واقعاً تبدیل درست انجام شده و numberValueاز نوع Intاست؟ برای این منظور از دستور ) type(of:استفاده میکنیم .در ادامه
))print(type(of: numberValue
300
Int
عبارات و عملگرها
ابتدا با دو کلمه آشنا شوید :
مثالً :X+Yیک عبارت است که در آن Xو Yعملوند و عالمت +عملگر به حساب میآیند.
زبانهای برنامه نویسی جدید دارای عملگرهایی هستند که از اجزاء معمول زبان به حساب میآیند Swift .دارای عملگرهای مختلفی از
جمله عملگرهای ریاضی ،تخصیصی ،مقایسهای ،منطقی و بیتی میباشد .از عملگرهای ساده ریاضی میتوان به عملگر جمع و تفر یق اشاره
کرد .انواع مختلف عملگر که در این بخش مورد بحث قرار میگیرند ،عبارتند از :
عملگرهای ریاضی
: را نشان میدهدSwift جدول زیر عملگرهای ریاضی. از عملگرهای ریاضی برای انجام محاسبات استفاده میکندSwift
برای رشتهها استفاده کنیم دو رشته را با هم ترکیب+ اگر از عملگر.استفاده از عملگرهای ریاضی برای نوع رشتهای نتیجه متفاوتی دارد
: را یاد بگیریمSwift حال میتوانیم با ایجاد یک برنامه نحوه عملکرد عملگرهای ریاضی در.کرده و به هم میچسباند
1 //Variable declarations
2 var num1:Int
3 var num2:Int
4 var msg1:String
5 var msg2:String
6
7 //Assign
8 num1 = 5
9 num2 = 3
10
11 //Demonstrate use of mathematical operators
12 print("The sum of \(num1) and \(num2) is \(num1 + num2).")
13 print("The difference of \(num1) and \(num2) is \(num1 - num2).")
14 print("The product of \(num1) and \(num2) is \(num1 * num2).")
15 print("The quotient of \(num1) and \(num2) is \(num1 / num2).")
16 print("The remainder of \(num1) divided by \(num2) is \(num1 % num2).")
17
18 //Demonstrate concatenation on strings using the + operator
19 msg1 = "Hello "
20 msg2 = "World!"
21 print(msg1 + msg2)
برنامه باال نتیجه هر عبارت را نشان میدهد .در این برنامه از متد )( printبرای نشان دادن نتایج در سطرهای متفاوت استفاده شده
است .در خط 21مشاهده میکنید که دو رشته به وسیله عملگر +به هم متصل شدهاند .نتیجه استفاده از عملگر +برای چسباندن دو
کلمه “ “Helloو ”! “Worldرشته ”! “Hello Worldخواهد بود .به فاصلههای خالی بعد از اولین کلمه توجه کنید اگر آنها را حذف
مقدار var1برابر است با حاصل جمع var1و var2 var1 += var2 =+
مقدار var1برابر است با حاصل تفریق var1و var2 var1 -= var2 =-
مقدار var1برابر است با حاصل ضرب var1در var2 var1 *= var2 =*
مقدار var1برابر است با حاصل تقسیم var1بر var2 var1 /= var2 =/
مقدار var1برابر است با باقیمانده تقسیم var1بر var2 var1 %= var2 =%
ال
از عملگر = +برای اتصال دو رشته نیز میتوان استفاده کرد .استفاده از این نوع عملگرها در واقع یک نوع خالصه نویسی در کد است .مث ً
شکل اصلی کد var1 += var2به صورت var1 = var1 + var2میباشد .این حالت کدنویسی زمانی کارایی خود را نشان میدهد
که نام متغیرها طوالنی باشد .برنامه زیر چگونگی استفاده از عملگرهای تخصیصی و تأثیر آنها را بر متغیرها نشان میدهد.
Assigning 10 to number...
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 28
Number = 10
Adding 10 to number...
Number = 20
Subtracting 10 from number...
Number = 10
در برنامه از 3عملگر تخصیصی استفاده شده است .ابتدا یک متغیر و مقدار 10با استفاده از عملگر = به آن اختصاص داده شده است.
سپس به آن با استفاده از عملگر = +مقدار 10اضافه شده است .و در آخر به وسیله عملگر = -عدد 10از آن کم شده است.
مقایسه دو مقدار درست باشد مقدار trueو اگر نتیجه مقایسه اشتباه باشد مقدار falseرا نشان میدهند .این عملگرها به طور معمول
در دستورات شرطی به کار میروند به این ترتیب که باعث ادامه یا توقف دستور شرطی میشوند .جدول زیر عملگرهای مقایسهای در
در مثال باال ابتدا دو متغیر را که میخواهیم با هم مقایسه کنیم را ایجاد کرده و به آنها مقادیری اختصاص میدهیم .سپس با استفاده از
یک عملگر مقایسهای آنها را با هم مقایسه کرده و نتیجه را چاپ میکنیم .به این نکته توجه کنید که هنگام مقایسه دو متغیر از عملگر ==
به جای عملگر = باید استفاده شود .عملگر = عملگر تخصیصی است و در عبارتی مانند x = yمقدار yرا در به xاختصاص میدهد .عملگر
== عملگر مقایسهای است که دو مقدار را با هم مقایسه میکند مانند x==yو اینطور خوانده میشود xبرابر است با .y
عملگرهای منطقی
عملگرهای منطقی بر روی عبارات منطقی عمل میکنند و نتیجه آنها نیز یک مقدار بولی است .از این عملگرها اغلب برای شرطهای پیچیده
ال یاد گرفتید مقادیر بولی میتوانند falseیا trueباشند .فرض کنید که var2و var3دو مقدار بولی
استفاده میشود .همانطور که قب ً
هستند.
اگر مقادیر دو طرف عملگر true ،ANDباشند عملگر ANDمقدار trueرا بر میگرداند .در غیر اینصورت اگر یکی از مقادیر یا هر دوی آنها
falseباشند مقدار falseرا بر میگرداند .در زیر جدول درستی عملگر ANDنشان داده شده است:
برای درک بهتر تأثیر عملگر ANDیاد آوری میکنم که این عملگر فقط در صورتی مقدار trueرا نشان میدهد که هر دو عملوند مقدارشان
trueباشد .در غیر اینصورت نتیجه تمام ترکیبهای بعدی falseخواهد شد .استفاده از عملگر ANDمانند استفاده از عملگرهای مقایسهای
است .به عنوان مثال نتیجه عبارت زیر درست ) (trueاست اگر سن ) (ageبزرگتر از 18و salaryکوچکتر از 1000باشد.
عملگر ANDزمانی کارامد است که ما با محدوده خاصی از اعداد سرو کار داریم .مثالً عبارت 10 <= x <= 100بدین معنی است که x
میتواند مقداری شامل اعداد 10تا 100را بگیرد .حال برای انتخاب اعداد خارج از این محدوده میتوان از عملگر منطقی ANDبه صورت زیر
استفاده کرد.
اگر یکی یا هر دو مقدار دو طرف عملگر ،ORدرست ) (trueباشد ،عملگر ORمقدار trueرا بر میگرداند .جدول درستی عملگر ORدر زیر
در جدول باال مشاهده میکنید که عملگر ORدر صورتی مقدار falseرا بر میگرداند که مقادیر دو طرف آن falseباشند .کد زیر را در
نظر بگیرید .نتیجه این کد در صورتی درست ) (trueاست که رتبه نهایی دانش آموز ) (finalGradeبزرگتر از 75یا یا نمره نهایی
امتحان آن 100باشد.
برخالف دو اپراتور ORو ANDعملگر منطقی ،NOTفقط به یک عملوند نیاز دارد .این عملگر یک مقدار یا اصطالح بولی را نفی میکند .مثالً
اگر عبارت یا مقدار trueباشد آنرا falseو اگر falseباشد آنرا trueمیکند .جدول زیر عملکرد اپراتور NOTرا نشان میدهد:
31 مبانی زبان Swift
X !X
true false
false true
عملگرهای بیتی
عملگرهای بیتی به شما اجازه میدهند که شکل باینری انواع دادهها را دستکاری کنید .برای درک بهتر این درس توصیه میشود که شما
سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را از لینک زیر یاد بگیرید :
http://www.w3-farsi.com/?p=5698
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده میکند وضعیت هر چیز یا خاموش است یا روشن .برای نشان دادن حالت روشن
از عدد 1و برای نشان دادن حالت خاموش از عدد 0استفاده میشود .بنابراین اعداد باینری فقط میتوانند صفر یا یک باشند .اعداد باینری
را اعداد در مبنای 2و اعداد اعشاری را اعداد در مبنای 10می گویند .یک بیت نشان دهنده یک رقم باینری است و هر بایت نشان دهنده
8بیت است .به عنوان مثال برای یک داده از نوع Intبه 32بیت یا 4بایت فضا برای ذخیره آن نیاز داریم ،این بدین معناست که اعداد
از 32رقم 0و 1برای ذخیره استفاده میکنند .برای مثال عدد 100وقتی به عنوان یک متغیر از نوع Intذخیره میشود در کامپیوتر به
000000000000000000000000000001100100
عدد 100در مبنای ده معادل عدد 1100100در مبنای 2است .در اینجا 7رقم سمت راست نشان دهنده عدد 100در مبنای 2است و مابقی
صفرهای سمت راست برای پر کردن بیتهایی است که عدد از نوع Intنیاز دارد .به این نکته توجه کنید که اعداد باینری از سمت راست
به چپ خوانده میشوند .عملگرهای بیتی Swiftدر جدول زیر نشان داده شدهاند :
عملگر بیتی ANDکاری شبیه عملگر منطقی ANDانجام میدهد با این تفاوت که این عملگر بر روی بیتها کار میکند .اگر مقادیر دو طرف آن
1باشد مقدار 1را بر میگرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر میگرداند .جدول درستی عمگر بیتی ANDدر زیر
آمده است:
)print(result
1
همانطور که در مثال باال مشاهده میکنید نتیجه عملکرد عملگر ANDبر روی دو مقدار 5و 3عدد یک میشود .اجازه بدهید ببینیم که
5: 00000000000000000000000000000101
3: 00000000000000000000000000000011
------------------------------------
1: 00000000000000000000000000000001
ابتدا دو عدد 5و 3به معادل باینریشان تبدیل میشوند .از آنجاییکه هر عدد صحیح ) 32 (Intبیت است از صفر برای پر کردن بیتهای
خالی استفاده میکنیم .با استفاده از جدول درستی عملگر بیتی ANDمیتوان فهمید که چرا نتیجه عدد یک میشود.
اگر مقادیر دو طرف عملگر بیتی ORهر دو صفر باشند نتیجه صفر در غیر اینصورت 1خواهد شد .جدول درستی این عملگر در زیر آمده
است :
33 مبانی زبان Swift
نتیجه عملگر بیتی ORدر صورتی صفر است که عملوندهای دو طرف آن صفر باشند .اگر فقط یکی از دو عملوند یک باشد نتیجه یک
)print(result
15
وقتی که از عملگر بیتی ORبرای دو مقدار در مثال باال ( 7و )9استفاده میکنیم نتیجه 15میشود .حال بررسی میکنیم که چرا این نتیجه
7: 00000000000000000000000000000111
9: 00000000000000000000000000001001
-----------------------------------
15: 00000000000000000000000000001111
با استفاده از جدول درستی عملگر بیتی ORمیتوان نتیجه استفاده از این عملگر را تشخیص داد .عدد 1111باینری معادل عدد 15صحیح
است.
در صورتیکه عملوندهای دو طرف این عملگر هر دو صفر یا هر دو یک باشند نتیجه صفر در غیر اینصورت نتیجه یک میشود .در مثال زیر
)print(result
2
در زیر معادل باینری اعداد باال ( 5و )7نشان داده شده است.
5: 00000000000000000000000000000101
7: 00000000000000000000000000000111
-----------------------------------
2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی ،XORمیتوان فهمید که چرا نتیجه عدد 2میشود.
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد .در زیر جدول درستی این عملگر آمده است:
1 0
0 1
عملگر بیتی NOTمقادیر بیتها را معکوس میکند .در زیر چگونگی استفاده از این عملگر آمده است :
)print(result
به نمایش باینری مثال باال که در زیر نشان داده شده است توجه نمایید.
7: 00000000000000000000000000000111
------------------------------------
-8: 11111111111111111111111111111000
این نوع عملگرها به شما اجازه میدهند که بیتها را به سمت چپ یا راست جا به جا کنید .دو نوع عملگر بیتی تغییر مکان وجود دارد که
هر کدام دو عملوند قبول میکنند .عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد جابه جایی بیت
این عملگر بیتهای عملوند سمت چپ را به تعداد nمکان مشخص شده توسط عملوند سمت راست ،به سمت چپ منتقل میکند .به
)print(result
40
در مثال باال ما بیتهای مقدار 10را دو مکان به سمت چپ منتقل کردهایم ،حال بیایید تأثیر این انتقال را بررسی کنیم :
10: 00000000000000000000000000001010
------------------------------------
40: 00000000000000000000000000101000
مشاهده میکنید که همه بیتها به اندازه دو واحد به سمت چپ منتقل شدهاند .در این انتقال دو صفر از صفرهای سمت چپ کم
این عملگر شبیه به عمگر تغییر مکان به سمت چپ است با این تفاوت که بیتها را به سمت راست جا به جا میکند .به عنوان مثال :
)print(result
6
با استفاده از عملگرتغییر مکان به سمت راست بیتهای مقدار 100را به اندازه 4واحد به سمت چپ جا به جا میکنیم .اجازه بدهید تأثیر
100: 00000000000000000000000001100100
------------------------------------
6: 00000000000000000000000000000110
هر بیت به اندازه 4واحد به سمت راست منتقل میشود ،بنابراین 4بیت اول سمت راست حذف شده و چهار صفر به سمت چپ اضافه
میشود.
عملگرهای محدوده
Swiftدارای سه نوع عملگر محدوده یا بازه میباشد که به کمک آنها میتوانید بازهای از مقادیر را نشان دهید:
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 36
عملگر
مثال توضیح
محدوده
، 1…5مقادیر 4 ،3 ،2 ،1و 5را به صورت ) (a…bتعریف میشود و مقادیر بین aو bرا شامل میشود (مقادیر
بسته
شامل میشود. aو bرا هم شامل میشود).
،1..<5مقادیر 3 ،2 ،1و 4را به صورت ) (a..<bتعریف میشود و مقادیر از aتا bرا شامل میشود (مقدار
نیمه باز
شامل میشود. bجز بازه نیست).
از این نوع عملگرها بیشتر در دستورات شرطی استفاده میشود که در درسهای آینده توضیح میدهیم.
عملگرهای متفرقه
سوییفت از عملگرهای دیگری نیز پشتیبانی می کند که در زیر می توانید آنها را مشاهده کنید:
+4معادل همان 4است. مقدار یک متغیر را بدون هیچ تغییری بر می گرداند. عملگر مثبت )(+
تقدم عملگرها
تقدم عملگرها ،مشخص میکند که در محاسباتی که بیش از دو عملوند دارند ،ابتدا کدام عملگر اثرش را اعمال کند .عملگرها در Swiftدر
اگر ما حق تقدم عملگرها را رعایت نکنیم و عبارت باال را از سمت چپ به راست انجام دهیم نتیجه 9خواهد شد ( 1+2=3سپس 3×3=9
و در آخر .)9/1=9اما کامپایلر با توجه به تقدم عملگرها محاسبات را انجام میدهد .برای مثال عمل ضرب و تقسیم نسبت به جمع و تفریق
تقدم دارند .بنابراین در مثال فوق ابتدا عدد 2ضربدر 3و سپس نتیجه آنها تقسیم بر 1میشود که نتیجه 6به دست میآید .در آخر عدد
6با 1جمع میشود و عدد 7حاصل میشود .در جدول زیر تقدم برخی از عملگرهای Swiftآمده است :
تقدم عملگر
* / %
– +
<< >>
=! ==
&
^
|
&&
||
?:
ابتدا عملگرهای با باالترین و سپس عملگرهای با پایینترین حق تقدم در محاسبات تأثیر میگذارند .برای ایجاد خوانایی در تقدم عملگرها
و انجام محاسباتی که در آنها از عملگرهای زیادی استفاده میشود از پرانتز استفاده میکنیم :
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 38
در مثال باال ابتدا هر کدام از عباراتی که داخل پرانتز هستند مورد محاسبه قرار میگیرند .به نکتهای در مورد عبارتی که در داخل پرانتز سوم
قرار دارد توجه کنید .در این عبارت ابتدا مقدار داخلیترین پرانتز مورد محاسبه قرار میگیرد یعنی مقدار 6ضربدر 7شده و سپس از 5کم
میشود .اگر دو یا چند عملگر با حق تقدم یکسان موجود باشد ابتدا باید هر کدام از عملگرها را که در ابتدای عبارت میآیند مورد ارزیابی
هر دو عملگر * و /دارای حق تقدم یکسانی هستند .بنابر این شما باید از چپ به راست آنها را در محاسبات تأثیر دهید .یعنی ابتدا 3را
ضربدر 2میکنید و سپس عدد 8را بر 4تقسیم میکنید .در نهایت نتیجه دو عبارت را جمع کرده و در متغیر numberقرار میدهید.
میکنید تا زمانی که دکمه Enterرا میزنید ،میخواند .به برنامه زیر توجه کنید :
با اجرای برنامه ،نشان گر ماوس نمایش داده میشود و برنامه از شما میخواهد که اطالعات را وارد کنید .برنامه از شما نام ،سن و قدتان
را میخواهد و شما باید بعد از وارد کردن اطالعات هر بخش ،دکمه Enterرا بزنید .با زدن دکمه Enterآخر ،خروجی به صورت زیر
Name is John
Age is 18
Height is 160.5
همانطور که در خطوط 15 ،14و 16کد باال مشاهده میکنید ،ما در جلوی نام هر متغیر یک عالمت ! گذاشتهایم .دلیل این کار این است که
تابع )( readLineیک رشته اختیاری را بر میگرداند ،در نتیجه شما برای باز کردن و نشان دادن مقدار این رشته باشد آن را unwrapیا
39 مبانی زبان Swift
باز کنید و این کار هم با استفاده از عالمت ! ممکن است .در همین حد کافیست که بدانید که تابع )( readLineورودی را از کاربر گرفته
و آنها را به صورت رشته در متغیرهای name ،ageو ( heightخطوط 5 ،2و )8قرار میدهد .قبول دارید که سن و قد باید از نوع عددی
باشند؟ اگر بخواهید فقط در محیط کنسول مقادیری را نمایش دهید که عددی یا غیر عددی بود مشکلی به وجود نمیآورد .مانند مثال
باال ،که ما فقط از کاربر اطالعاتی را گرفته و چاپ کردهایم .ولی اگر بخواهیم دو عدد را با هم جمع کنیم ،باید چکار کنیم .به کد ز یر توجه
کنید :
)(print
همانطور که مشاهده میکنید بعد از وارد کردن اعداد 10و 5خروجی عدد 105میشود .البته در اصل عدد 105نیست ،بلکه برنامه دو عدد
را مانند دو رشته در نظر میگیرد و آنها را به هم میچسباند .اگر بخواهیم این دو عدد را واقعاً با هم جمع کنیم و عدد 15را به دست
بیاوریم باید بعد از تابع )( readLineاز توابع تبدیل داده که در درسهای قبل ذکر کردیم به صورت زیر استفاده نمایید:
)(print
Sum is : 15
همانطور که گفتیم ،تابع )( readLineرشته دریافت میکند ،برای تبدیل این رشته به عدد صحیح از تابع )( Intدر استفاده کردهایم .در
نتیجه تابع )( Intرشته گرفته شده توسط تابع )( readLineرا به نوع صحیح تبدیل کرده و در متغیرهای number1و number2
میگذارد .با این وجود میتوانیم دو متغیر را که عددی هستند با هم جمع کنیم.
ساختارهای تصمیم
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 40
تقریبا همه زبانهای برنامه نویسی به شما اجازه اجرای کد را در شرایط مطمئن می دهند .حال تصور کنید که یک برنامه دارای ساختار
تصمیم گیری نباشد و همه کدها را اجرا کند .این حالت شاید فقط برای چاپ یک پیغام در صفحه مناسب باشد ولی فرض کنید که شما
بخواهید اگر مقدار یک متغیر با یک عدد برابر باشد سپس یک پیغام چاپ شود آن وقت با مشکل مواجه خواهید شد Swift .راه های
مختلفی برای رفع این نوع مشکالت ارائه می دهد .در این بخش با مطالب زیر آشنا خواهید شد :
دستور if
میتوان با استفاده از دستور ifو یک شرط خاص که باعث ایجاد یک کد میشود یک منطق به برنامه خود اضافه کنید .دستور if
سادهترین دستور شرطی است که برنامه میگوید اگر شرطی برقرار است ،کد معینی را انجام بده .ساختار دستور ifبه صورت زیر است :
)if (condition
{
code to execute
}
قبل از اجرای دستور ifابتدا شرط بررسی میشود .اگر شرط برقرار باشد یعنی درست باشد سپس کد اجرا میشود .شرط یک عبارت
مقایسهای است .میتوان از عملگرهای مقایسهای برای تست درست یا اشتباه بودن شرط استفاده کرد .اجازه بدهید که نگاهی به نحوه
استفاده از دستور ifدر داخل برنامه بیندازیم .برنامه زیر پیغام Hello Worldرا اگر مقدار numberکمتر از 10و Goodbye Worldرا
}
Hello World.
Goodbye World.
در خط 2یک متغیر با نام numberتعریف و مقدار 5به آن اختصاص داده شده است .وقتی به اولین دستور ifدر خط 5میرسیم برنامه
منطقی است که نتیجه مقایسه درست میباشد .بنابراین خط 7اجرا و پیغام Hello Worldچاپ میشود .حال مقدار numberرا به 15
تغییر میدهیم (خط .)11وقتی به دومین دستور ifدر خط 14میرسیم برنامه مقدار numberرا با 10مقایسه میکند و چون مقدار
numberیعنی 15از 10بزرگتر است برنامه پیغام Goodbye Worldرا چاپ میکند (خط .)16به این نکته توجه کنید که دستور ifرا
شما میتوانید چندین دستور را در داخل دستور ifبنویسید .کافیست که از یک آکوالد برای نشان دادن ابتدا و انتهای دستورات استفاده
کنید .همه دستورات داخل بین آکوالد جز بدنه دستور ifهستند .نحوه تعریف چند دستور در داخل بدنه ifبه صورت زیر است :
)if (condition
{
statement1
statement2
.
.
.
statementN
}
در مثال باال اگر مقدار xاز 10بزرگتر باشد دو پیغام چاپ میشود .فراموش نکنید که از قلم انداختن یک آکوالد باعث به وجود آمدن خطا
دستور if…else
دستور ifفقط برای اجرای یک حالت خاص به کار میرود .یعنی اگر حالتی برقرار بود ،کار خاصی انجام شود .اما زمانی که شما بخواهید،
اگر شرط خاصی برقرار شد ،یک دستور و اگر برقرار نبود ،دستور دیگر اجرا شود ،باید از دستور if elseاستفاده کنید .ساختار دستور if
)if (condition
تخصصی ترین سایت آموزش برنامه نویسیw3-farsi.com 42
{
code to execute if condition is true
}
else
{
code to execute if condition is false
}
فقط در صورتی اجراelse کد داخل بلوک. به کار برده شودif نمیتوان به تنهایی استفاده کرد بلکه حتماً باید باelse از کلمه کلیدی
. آمده استif…else در زیر نحوه استفاده از دستور. نادرست باشدif میشود که شرط داخل دستور
1 var number = 5
2
3 //Test the condition
4 if (number < 10)
5 {
6 print("The number is less than 10.")
7 }
8 else
9 {
10 print("The number is either greater than or equal to 10.")
11 }
12
13 //Modify value of number
14 number = 15
15
16 //Repeat the test to yield a different result
17 if (number < 10)
18 {
19 print("The number is less than 10.")
20 }
21 else
22 {
23 print("The number is either greater than or equal to 10.")
24 }
کمتر است یا نه و چون10 ازnumber تست میکنیم که آیا مقدار متغیر4 تعریف کردهایم و در خطnumber یک متغیر به نام1 در خط
تغییر دهیم10 را تغییر دهیم و به مقداری بزرگتر ازnumber ) و اگر مقدار6 اجرا میشود (خطif کمتر است در نتیجه کد داخل بلوک
.)23 اجرا میشود (خطelse ) و کد داخل بلوک17 شرط نادرست میشود (خط،)14 (خط
تو در توif دستور
. دیگرif در داخل دستورif یک دستور ساده. استفاده کردSwift تو در تو درif میتوان از دستور
if (condition)
{
code to execute
if (condition)
{
code to execute
43 مبانی زبان Swift
}
)else if (condition
{
)if (condition
{
code to execute
}
}
}
else
{
)if (condition
{
code to execute
}
}
اجازه بدهید که برنامه را کالبد شکافی کنیم .ابتدا در خط 1یک متغیر به نام ageتعریف میکنیم و مقدار آن را برابر 21قرار میدهیم.
سپس به اولین دستور ifمیرسیم (خط .)3در این قسمت اگر سن شما بیشتر از 12سال باشد برنامه وارد بدنه دستور ifمیشود در
حال فرض کنیم که سن شما بیشتر از 12سال است و شما وارد بدنه اولین ifشدهاید .در بدنه اولین ifیک دستور ifدیگر را مشاهده
میکنید .اگر سن کمتر 20باشد دستور You are teenageچاپ میشود (خط )7در غیر اینصورت دستور You are already an
( adultخط )11و چون مقدار متغیر تعریف شده در خط 5بزرگتر از 20است پس دستور مربوط به بخش elseخط 11چاپ میشود.
حال فرض کنید که مقدار متغیر ageکمتر از 12بود ،در این صورت دستور بخش elseخط 16یعنی You are still too young
چاپ میشد .پیشنهاد میشود که از ifتو در تو در برنامه کمتر استفاده کنید چون خوانایی برنامه را پایین میآورد.
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 44
دستور ifچندگانه
اگر بخواهید چند شرط را بررسی کنید چکار میکنید؟ میتوانید از چندین دستور ifاستفاده کنید و بهتر است که این دستورات ifرا به
)if (condition
{
code to execute
}
else
{
)if (condition
{
code to execute
}
else
{
)if (condition
{
code to execute
}
else
{
code to execute
}
}
}
خواندن کد باال سخت است .بهتر است دستورات را به صورت تو رفتگی در داخل بلوک elseبنویسید .میتوانید کد باال را سادهتر کنید
:
)if (condition
{
code to execute
}
)else if (condition
{
code to execute
}
)else if (condition
{
code to execute
}
else
{
code to execute
}
حال که نحوه استفده از دستور else ifرا یاد گرفتید باید بدانید که مانند else if ،elseنیز به دستور ifوابسته است .دستور
else ifوقتی اجرا میشود که اولین دستور ifاشتباه باشد حال اگر else ifاشتباه باشد دستور else ifبعدی اجرا میشود .و
اگر آن نیز اجرا نشود در نهایت دستور elseاجرا میشود .برنامه زیر نحوه استفاده از دستور if elseرا نشان میدهد :
خروجی برنامه باال به متغیر choiceوابسته است .بسته به اینکه شما چه چیزی انتخاب میکنید پیغامهای مختلفی چاپ میشود .اگر
عددی که شما تایپ میکنید در داخل حالتهای انتخاب نباشد کد مربوط به بلوک elseاجرا میشود.
یک مقدار بولی را بر میگردانند .در جدول زیر برخی از عملگرهای منطقی آمده است :
عملگر مقدارشان trueباشد .اگر فقط مقدار یکی از )z = (x > 2) && (y < 10 and &&
طرف عملگر مقدارشان trueباشد .اگر هر دو شرط )z = (x > 2) || (y < 10 or ||
باشد و در صورتی falseاست که مقدار شرط true )z = !(x > 2 not !
باشد.
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 46
به عنوان مثال جمله ) z = (x > 2) && (y < 10را به این صورت بخوانید“ :در صورتی مقدار zبرابر trueاست که مقدار xبزرگتر
از 2و مقدار yکوچکتر از 10باشد در غیر اینصورت falseاست” .این جمله بدین معناست که برای اینکه مقدار کل دستور trueباشد
عملگر منطقی || تأثیر متفاوتی نسبت به عملگر منطقی && دارد .نتیجه عملگر منطقی || برابر trueاست اگر فقط مقدار یکی از شروط
trueباشد .و اگر مقدار هیچ یک از شروط trueنباشد نتیجه falseخواهد شد .میتوان عملگرهای منطقی && و || را با هم ترکیب
در اینجا استفاده از پرانتز مهم است چون از آن در گروه بندی شرطها استفاده میکنیم .در اینجا ابتدا عبارت )(y > 3) || (z < 10
مورد بررسی قرار میگیرد( .به علت تقدم عملگرها) سپس نتیجه آن بوسیله عملگر && با نتیجه ) (x == 1مقایسه میشود .حال بیایید
نحوه استفاده از عملگرهای منطقی در برنامه را مورد بررسی قرار دهیم :
برنامه باال نحوه استفاده از عملگر منطقی && را نشان میدهد (خط .)7وقتی به دستور ifمیرسید (خط )7برنامه سن شما را چک
میکند .اگر سن شما بزرگتر از 12و کوچکتر از 20باشد (سنتان بین 12و 20باشد) یعنی مقدار هر دو trueباشد سپس کدهای داخل بلوک
ifاجرا میشوند .اگر نتیجه یکی از شروط falseباشد کدهای داخل بلوک elseاجرا میشود.
47 مبانی زبان Swift
عملگر && عملوند سمت چپ را مورد بررسی قرار میدهد .اگر مقدار آن falseباشد دیگر عملوند سمت راست را بررسی نمیکند و مقدار
falseرا بر میگرداند .بر عکس عملگر || عملوند سمت چپ را مورد بررسی قرار میدهد و اگر مقدار آن trueباشد سپس عملوند سمت
شما میتوانید از عملگرهای && و || بیتی هم در شرط ها استفاده کنید .این عملگرها دو عملوند را بدون در نظر گرفتن مقدار عملوند سمت
چپ مورد بررسی قرار میدهند .به عنوان مثال حتی اگر مقدار عملوند سمت چپ falseباشد عملوند سمت چپ به وسیله عملگر بیتی
& ارزیابی میشود .اگر شرطها را در برنامه ترکیب کنید استفاده از عملگرهای منطقی && و || به جای عملگرهای بیتی && و || بهتر خواهد
بود:
یکی دیگر از عملگرهای منطقی عملگر ! است که نتیجه یک عبارت را خنثی یا منفی میکند .به مثال زیر توجه کنید:
)if (x != 2
{
)"print("x is not equal to 2.
}
اگر نتیجه عبارت x == 2برابر falseباشد عملگر ! آن را trueمیکند .می توان خط 7کد باال را به صورت زیر هم نوشت:
)!if(12...20 ~= age
{
// Some Code
}
دستور Switch
در Swiftساختاری به نام switchوجود دارد که به شما اجازه میدهد که با توجه به مقدار ثابت یک متغیر چندین انتخاب داشته
باشید .دستور switchمعادل دستور ifتو در تو است با این تفاوت که در دستور switchمتغیر فقط مقادیر ثابتی از اعداد ،رشتهها و
یا کاراکترها را قبول میکند .مقادیر ثابت مقادیری هستند که قابل تغییر نیستند .در زیر نحوه استفاده از دستور switchآمده است :
)switch (testVar
{
case compareVal1:
code to execute if testVar == compareVa11
case compareVa12:
code to execute if testVar == compareVa12
.
.
تخصصی ترین سایت آموزش برنامه نویسیw3-farsi.com 48
.
case compareVa1N:
code to execute if testVer == compareVa1N
default:
code to execute if none of the values above match the testVar
}
داخل بلوکcase این مقدار با هر یک از عبارتهای. است قرار میدهیدtestVar که در مثال باالswitch ابتدا یک مقدار در متغیر
اجرا خواهدcase برابر بود کد مربوط به آنcase اگر مقدار متغیر با هر یک از مقادیر موجود در دستورات. مقایسه میشودswitch
دستور. از یکی بیشتر باشد نباید از آکوالد استفاده کنیمcase به این نکته توجه کنید که حتی اگر تعداد خط کدهای داخل دستور.شد
. برابر نباشدcase این دستور در صورتی اجرا میشود که مقدار متغیر با هیچ یک از مقادیر دستورات. داردdefault یک بخشswitch
مکان این دستور هم مهم نیست اما بر طبق. حذف شود هیچ اتفاقی نمیافتدswitch اختیاری است و اگر از بدنهdefault دستور
][1 Dog
][2 Cat
][3 Rabbit
][4 Turtle
][5 Fish
][6 Not in the choices
برنامه باال به شما اجازه انتخاب حیوان مورد عالقهتان را میدهد .به اسم هر حیوان یک عدد نسبت داده شده است .شما عدد را وارد
میکنید و این عدد در دستور switchبا مقادیر caseمقایسه میشود و با هر کدام از آن مقادیر که برابر بود پیغام مناسب نمایش داده
خواهد شد .اگر هم با هیچ کدام از مقادیر caseها برابر نبود دستور defaultاجرا میشود .یکی دیگر از ویژگیهای دستور switchاین
است که شما میتوانید از دو یا چند مقدار برای مقایسه استفاده کنید .در مثال زیر اگر مقدار numberعدد 2 ،1یا 3باشد یک کد اجرا
)switch(number
{
case 1, 2, 3:
)"print("This code is shared by three values.
}
همانطور که قبالً ذکر شد دستور switchمعادل دستور if elseاست .برنامه باال را به صورت زیر نیز میتوان نوشت :
کد باال دقیقاً نتیجهای مانند دستور switchدارد .دستور defaultمعادل دستور elseمیباشد .گاهی اوقات الزم است که با وجود اجرا
شدن یک caseدوست دارید ،بقیه caseها هم اجرا شوند .در این صورت میتوانید از عبارت fallthroughاستفاده کنید :
)switch(number
{
case 11, 10, 20:
)"!print("first case executed
case 45:
)"!print("second case executed
default:
)"print("default statement
}
در کد باال از دستور fallthroughاستفاده نشده ،در نتیجه برنامه بعد از اجرای دستور caseی که صحیح است ،از دستور Switch
خارج میشود .اما در کد زیر از دستور fallthroughاستفاده شده است و در نتیجه دستورات مربوط به بقیه caseها هم اجرا میشوند:
)switch(number
{
case 11, 10, 20:
)"!print("first case executed
fallthrough
case 45:
)"!print("second case executed
default:
)"print("default statement
}
عملگر شرطی
عملگر شرطی ) (?:در Swiftمانند دستور شرطی if…elseعمل میکند .در زیر نحوه استفاده از این عملگر آمده است:
عملگر شرطی تنها عملگر سه تایی Swiftاست که نیاز به سه عملوند دارد ،شرط ،یک مقدار زمانی که شرط درست باشد و یک مقدار
زمانی که شرط نادرست باشد .اجازه بدهید که نحوه استفاده این عملگر را در داخل برنامه مورد بررسی قرار دهیم.
8
9 )print(type1
10 )print(type2
dog
cat
برنامه باال نحوه استفاده از این عملگر شرطی را نشان میدهد .خط 6به صورت زیر ترجمه میشود :اگر مقدار pet1برابر با puppyسپس
مقدار dogرا در type1قرار بده در غیر این صورت مقدار catرا type1قرار بده .خط 7به صورت زیر ترجمه میشود :اگر مقدار pet2
برابر با kittenسپس مقدار catرا در type2قرار بده در غیر این صورت مقدار .dogحال برنامه باال را با استفاده از دستور if else
مینویسیم:
هنگامی که چندین دستور در داخل یک بلوک ifیا elseدارید از عملگر شرطی استفاده نکنید چون خوانایی برنامه را پایین میآورد.
تکرار
ساختارهای تکرار به شما اجازه میدهند که یک یا چند دستور کد را تا زمانی که یک شرط برقرار است تکرار کنید .بدون ساختارهای تکرار
شما مجبورید همان تعداد کدها را بنویسید که بسیار خسته کننده است .مثالً شما مجبورید 10بار جمله ” “.Hello Worldرا تایپ کنید
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
print("Hello )"World.
البته شما میتوانید با کپی کردن این تعداد کد را راحت بنویسید ولی این کار در کل کیفیت کدنویسی را پایین میآورد .راه بهتر برای
for-in
do while
repeat…while
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 52
حلقه While
ابتداییترین ساختار تکرار در Swiftحلقه Whileاست .ابتدا یک شرط را مورد بررسی قرار میدهد و تا زمانیکه شرط برقرار باشد کدهای
درون بلوک اجرا میشوند .ساختار این حلقه به صورت زیر است :
)while(condition
{
// code to loop
}
میبینید که ساختار Whileمانند ساختار ifبسیار ساده است .ابتدا یک شرط را که نتیجه آن یک مقدار بولی است ،مینویسیم .اگر
نتیجه درست یا trueباشد ،سپس کدهای داخل بلوک Whileاجرا میشوند .اگر شرط غلط یا falseباشد وقتی که برنامه به حلقه
Whileبرسد هیچکدام از کدها را اجرا نمیکند .برای متوقف شدن حلقه باید مقادیر داخل حلقه Whileاصالح شوند.
به یک متغیر شمارنده در داخل بدنه حلقه نیاز داریم .این شمارنده برای آزمایش شرط مورد استفاده قرار میگیرد و ادامه یا توقف حلقه
به نوعی به آن وابسته است .این شمارنده را در داخل بدنه باید کاهش یا افزایش دهیم .در برنامه زیر نحوه استفاده از حلقه Whileآمده
است :
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
برنامه باال 10بار پیغام ! Hello Worldرا چاپ میکند .اگر از حلقه در مثال باال استفاده نمیکردیم ،مجبور بودیم تمام 10خط را تایپ
کنیم .اجازه دهید که نگاهی به کدهای برنامه فوق بیندازیم .ابتدا در خط 1یک متغیر تعریف و از آن به عنوان شمارنده حلقه استفاده شده
است .سپس به آن مقدار 1را اختصاص میدهیم چون اگر مقدار نداشته باشد ،نمیتوان در شرط از آن استفاده کرد.
در خط 3حلقه Whileرا وارد میکنیم .در این حلقه ابتدا مقدار اولیه شمارنده با 10مقایسه میشود که آیا از 10کمتر است یا با آن برابر
است .نتیجه هر بار مقایسه ورود به بدنه حلقه و چاپ پیغام است .همانطور که مشاهده میکنید بعد از هر بار مقایسه مقدار شمارنده
یک واحد اضافه میشود (خط .)6حلقه تا زمانی تکرار میشود که مقدار شمارنده از 10کمتر باشد.
53 مبانی زبان Swift
اگر مقدار شمارنده یک بماند و آن را افزایش ندهیم و یا مقدار شرط هرگز falseنشود یک حلقه بینهایت به وجود میآید .به این نکته
توجه کنید که در شرط باال به جای عالمت > از >= استفاده شده است .اگر از عالمت > استفاده میکردیم کد ما 9بار تکرار میشد چون
مقدار اولیه 1است و هنگامی که شرط به 10برسد falseمیشود چون 10 < 10نیست .اگر میخواهید یک حلقه بی نهایت ایجاد کنید
که هیچگاه متوقف نشود باید یک شرط ایجاد کنید که همواره درست ) (trueباشد.
)while(true
{
//code to loop
}
این تکنیک در برخی موارد کارایی دارد و آن زمانی است که شما بخواهید با استفاده از دستورات breakو returnکه در آینده توضیح
repeat…while
حلقه repeat whileیکی دیگر از ساختارهای تکرار است .این حلقه بسیار شبیه حلقه whileاست با این تفاوت که در این حلقه ابتدا
کد اجرا میشود و سپس شرط مورد بررسی قرار میگیرد .ساختار حلقه repeat whileبه صورت زیر است :
repeat
{
//code to repeat
همانطور که مشاهده میکنید شرط در آخر ساختار قرار دارد .این بدین معنی است که کدهای داخل بدنه حداقل یکبار اجرا میشوند.
برخالف حلقه whileکه اگر شرط نادرست باشد دستورات داخل بدنه اجرا نمیشوند .یکی از موراد برتری استفاده از حلقه repeat
whileنسبت به حلقه ،whileزمانی است که ،شما بخواهید اطالعاتی از کاربر دریافت کنید .به مثال زیر توجه کنید :
استفاده از while
//while version
مشاهده میکنید که از کدهای کمتری در بدنه repeat whileنسبت به whileاستفاده شده است.
حلقه for…in
یکی دیگر از ساختارهای تکرار ،حلقه forاست .این حلقه عملی شبیه به حلقه whileانجام میدهد و از آن برای گردش در میان یک
مجموعه ) (collectionیا محدوده ) (rangeاستفاده می شود .ساختار حلقه forبه صورت زیر است :
Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
Number 10
برنامه باال اعداد 1تا 10را با استفاده از حلقه forچاپ می کند .در خط ،1همانطور که مشاهده می کنید عبارت 1…10آمده است که در
اصل یک محدود است .برای ایجاد یک محدوده در Swiftابتدا و انتهای مجموعه را مشخص کرده و سپس با استفاده از عالمت … از
هم جدا می کنیم .عبارت 1…10به معنای محدود اعداد از 1تا 10است .در کل معنای خط 1این است که به ازای اعداد 1تا … 10فالن کار را
انجام بده .چه کاری؟ کاری که در خط 3خواسته ایم و آن چاپ مقدار اعداد این محدود است .در اصل در خط 1با هر تکرار یکی از اعداد
مجموعه در داخل متغیر موقتی iقرار می گیرد و در خط 3چاپ می شود و این کار تا چاپ آخرین مقدار یعنی 10ادامه می یابد .اگر
بخواهید عدد انتهای محدود یعنی 10چاپ نشود باید از کلمه > استفاده نمایید:
for i in 1..<10
از حلقه forبرای چاپ حروف یک رشته هم می توان استفاده کرد .چون رشته یک مجموعه از کاراکترهاست:
H
55 Swift مبانی زبان
e
l
l
o
W
o
r
l
d
!
. میتوان بخشی از حلقه را رد کرد و به مرحله بعد رفتcontinue حلقه را متوقف کرده و با استفاده از کلمه کلیدیbreak کلمه کلیدی
Number 1
Number 2
Number 3
Number 4
Number 1
Number 2
Number 3
Number 4
Number 6
Number 7
Number 8
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 56
Number 9
در این برنامه از حلقه forبرای نشان دادن کاربرد دو کلمه کلیدی فوق استفاده شده است اگر به جای forاز حلقههای whileو
repeat…whileاستفاده میشد نتیجه یکسانی به دست میآمد .همانطور که در شرط برنامه (خط )5آمده است وقتی که مقدار xبه
حلقه بالفاصله متوقف میشود حتی اگر شرط x < 10برقرار باشد .از طرف دیگر در خط 16حلقه forفقط برای یک تکرار خاص متوقف
شده و سپس ادامه مییابد (وقتی مقدار xبرابر 5شود حلقه از 5رد شده و مقدار 5را چاپ نمیکند و بقیه مقادیر چاپ میشوند).
آرایه ها
آرایه نوعی متغیر است که لیستی از آدرسهای مجموعهای از دادههای هم نوع را در خود ذخیره میکند .تعریف چندین متغیر از یک نوع
برای هدفی یکسان بسیار خسته کننده است .مثالً اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها استفاده کنید .مطمئناً
تعریف این همه متغیر بسیار کسالت آور و خسته کننده است .اما با استفاده از آرایه میتوان همه آنها را در یک خط تعریف کرد .در زیر
راهی ساده برای تعریف یک آرایه نشان داده شده است :
arrayNameکه نام آرایه را نشان میدهد Datatype .نوع دادههایی را نشان میدهد که آرایه در خود ذخیره میکند .کروشه که نوع
داده در داخل آن قرار میگیرد و نشان دهنده استفاده از آرایه است و در نهایت عالمتهای باز و بسته پرانتز که در ادامه در مورد آنها
توضیح میدهیم .هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد .به عنوان مثال برای نامگذاری آرایهای که
اعداد را در خود ذخیره میکند .برای مثال ،فرض کنید میخواهیم یک آرایه تعریف کنیم که مقادیر صحیح را در خود ذخیره کند:
در کد باال ما یک آرایه خالی تعریف کردهایم که قرار است اعداد صحیح را در خود ذخیره کند .حال چطور مقادیرمان را به این آرایه اضافه
همانطور که در کد باال مشاهده میکنید بعد از عملگر = ،+مقادیری که قرار است به آرایه اضافه شوند را ،در داخل کروشه مینویسیم .توجه
کنید که هر عنصر از آرایه دارای یک اندیس است .اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود .به
عنوان مثال شما یک آرایه 5عضوی دارید ،اندیس آرایه از 0تا 4میباشد چون طول آرایه 5است پس 5-1برابر است با .4این بدان
معناست که اندیس 0نشان دهنده اولین عضو آرایه است و اندیس 1نشان دهنده دومین عضو و الی آخر .برای درک بهتر مثال باال به
دچار اشتباه میشوند و مثالً ممکن است در مثال باال اندیسها را از 1شروع کنند .اگر بخواهید به یکی از اجزائ آرایه با استفاده از اندیسی
دسترسی پیدا کنید که در محدوده اندیسهای آرایه شما نباشد با پیغام خطای Index out of rangeمواجه میشوید و بدین معنی
است که شما آدرسی را میخواهید که وجود ندارد .یکی دیگر از راههای تعریف سریع و مقدار دهی یک آرایه به صورت زیر است :
ً
فورا بعد از تعریف اندازه آرایه مقادیر را در داخل کروشه قرار دهید .به یاد داشته باشید که هر کدام از مقادیر در این روش شما میتوانید
را با استفاده از کاما از هم جدا کنید .به مثال زیر توجه کنید :
این مثال با مثال قبل هیچ تفاوتی ندارد و تعداد خطهای کدنویسی را کاهش میدهد .شما میتوانید با استفاده از اندیس به مقدار هر
یک از اجزاء آرایه دسترسی یابید و آنها را به دلخواه تغییر دهید .یکی دیگر از راههای تعریف آرایه در زیر آمده است .شما میتوانید هر
تعداد عنصر را که خواستید در آرایه قرار دهید بدون اینکه نوع آرایه را مشخص کنید .به عنوان مثال :
در این مثال ما 10مقدار را به آرایه اختصاص دادهایم .روش دیگر برای تعریف آرایه به صورت زیر است:
در این روش بعد از عالمت مساوی کلمه کلیدی Arrayرا نوشته و در داخل پرانتزها از دو کلمه repeatingو countاستفاده میکنید.
کلمه ،countتعداد عناصر آرایه را مشخص میکند و کلمه repeatingهم یک مقدار اولیه را در داخل عناصر آرایه قرار میدهد .به کد
کد باال یک آرایه با نام numberایجاد کرده که دارای 5خانه است و در داخل هر خانه هم عدد 0قرار دارد:
][0, 0, 0, 0, 0
حال چگونه به همچین آرایهای ،مقادیری را که میخواهیم ،اختصاص دهیم؟ به کد زیر توجه کنید:
4
5 ]numbers[0 = 1
6 ]numbers[1 = 2
7 ]numbers[2 = 3
8 ]numbers[3 = 4
9 ]numbers[4 = 5
10
11 )]print("Element 4 after initialize : ", numbers[3
در خط 1کد باال یک آرایه تعریف و تمام 5خانه آن را با عدد صفر مقداردهی کردهایم .برای اطمینان در خط 3مقدار چهارمین عنصر را
چاپ کردهایم .همانطور که در خروجی مشاهده میکنید ،عدد 0نمایش داده میشود .در ادامه و در خطوط ،5-9آرایه را با مقادیر جدید
پر میکنیم .در این خطوط ابتدا نام آرایه و در داخل کروشه اندیس خانهای که قرار است مقداری را در داخل آن قرار دهیم ،مینویسیم.
سپس با استفاده از عالمت = مقدار را به آن خانه اختصاص میدهیم .خانه چهارم آرایه که اندیس آن 3است را با مقدار ،4مقداردهی و
در خط 11بار دیگر مقدار این خانه را چاپ میکنیم .مشاهده میکنید که در خروجی ،عدد 4نمایش داده میشود .یعنی شکل نهایی این
1, 2, 3, 4, 5
در زیر مثالی در مورد استفاده از آرایهها آمده است .در این برنامه 5مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
در خط 1یک آرایه تعریف شده است که میتواند 5عدد صحیح را در خود ذخیره کند .هنگام تعریف این آرایه از عالمت ? استفاده کردهایم
و با این کار به برنامه می گوییم که ممکن است در ادامه یا در هنگام اجرای برنامه مقادیری را به خانههای آرایه که همه با 0پر شدهاند،
اختصاص دهیم .خطوط 2و 3متغیرهایی تعریف شدهاند که از آنها برای محاسبه میانگین استفاده میشود .توجه کنید که مقدار اولیه
59 مبانی زبان Swift
totalصفر است تا از بروز خطا هنگام اضافه شدن مقدار به آن جلوگیری شود .در خطوط 5تا 9یک حلقه forبرای تکرار و گرفتن
ورودی از کاربر تعریف شده است .کالً کار این حلقه این است که مقادیر را از کاربر میگیرد و در داخل خانههای آرایه قرار میدهد .از
خاصیت countآرایه برای تشخیص تعداد اجزای آرایه استفاده میشود .اگر چه میتوانستیم به سادگی در حلقه forمقدار 5را برای
شرط قرار دهیم ولی استفاده از خاصیت countآرایه کار راحتتری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه forبا تغییر
جدید هماهنگ میشود .در خط 8ورودی دریافت شده از کاربر به نوع Intتبدیل و در آرایه ذخیره میشود .اندیس استفاده شده در
( numberخط )8مقدار iجاری در حلقه است .برای مثال در ابتدای حلقه مقدار iصفر است بنابراین وقتی در خط 8اولین داده از کاربر
گرفته میشود ،اندیس آن برابر صفر میشود .در تکرار بعدی iیک واحد اضافه میشود و در نتیجه در خط 8و بعد از ورود دومین داده
توسط کاربر اندیس آن برابر یک میشود .این حالت تا زمانی که شرط در حلقه forبرقرار است ادامه مییابد .در خطوط 10-13از حلقه
forدیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده است .در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده
هر یک از اجزای عددی آرایه به متغیر totalاضافه میشوند .بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط .)15مقدار
totalرا بر تعداد اجزای آرایه (تعداد عددها) تقسیم میکنیم .برای دسترسی به تعداد اجزای آرایه میتوان از خاصیت countآرایه
استفاده کرد .توجه کنید که در خط 15ما حاصل عبارت را به نوع Doubleتبدیل کردهایم بنابراین نتیجه عبارت یک مقدار از نوع double
خواهد شد و دارای بخش کسری میباشد .حال اگر عملوندهای تقسیم را به نوع Doubleتبدیل نکنیم نتیجه تقسیم یک عدد از نوع
صحیح خواهد شد و دارای بخش کسری نیست .خط 17مقدار میانگین را در صفحه نمایش چاپ میکند .طول آرایه بعد از مقدار دهی
دهید .البته تعداد خاصی از کالسها مانند آرایهها عمل میکنند و توانایی تغییر تعداد اجزای تشکیل دهنده خود را دارند .آرایهها در برخی
شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور از آنها استفاده کنید بسیار مهم است.
بعدی را میتوان مانند یک جدول با تعدادی ستون و سطر تصور کنید .با افزایش اندیسها اندازه ابعاد آرایه نیز افزایش مییابد و آرایههای
چند بعدی با بیش از دو اندیس به وجود میآیند .نحوه ایجاد یک آرایه با دو بعد به صورت زیر است :
همانطور که قبال گفتیم ،وجود کروشه به معنای آرایه است .در کد باال [[typeArray]] ،به معنای آرایه ای از آرایه ها است .کد باال را به
میتوان یک آرایه با تعداد زیادی بعد ایجاد کرد به شرطی که هر بعد دارای طول مشخصی باشد .در یک آرایه دو بعدی برای دسترسی
به هر یک از عناصر به دو مقدار نیاز داریم یکی اندیس سطر ) (rowو دیگری اندیس ستونی ) (columnاست که آن عنص درآن قرار
دارد .البته اگر ما آرایه دو بعدی را به صورت جدول در نظر بگیریم .در شکل زیر مکان هر عنصر در یک آرایه دو بعدی نشان داده شده
است.
مقدار 3را به ،rowچون 3سطر یا آرایه داریم و مقدار 5را به columnچون هر آرایه 5ستون دارد ،اختصاص میدهیم .چطور یک آرایه
چند بعدی را مقدار دهی کنیم؟ می خواهیم به سه روش باال یک آرایه تعریف کنیم که دارای 4ستون و 2سطر باشد .به روش اول توجه
کنید:
در روش باال و خط ،1ما یک آرایه دو بعدی تعریف کرده ایم .سپس در خطوط 7-3و 9-12دو آرایه به نام های row1و row2ایجاد و
آنها را در خطوط 15و 16به آرایه دو بعدی مان اضافه نموده ایم.
روش سوم
61 مبانی زبان Swift
در روش سوم که از کالس Arrayاستفاده کردهایم باید مقدار دهی به عناصر را به صورت دستی انجام داد .همانطور که مشاهده میکنید
برای دسترسی به هر یک از عناصر در یک آرایه دو بعدی به سادگی میتوان از اندیسهای rowو columnو یک جفت کروشه مانند مثال
استفاده کرد.
گردش در میان عناصر آرایههای چند بعدی نیاز به کمی دقت دارد .یکی از راههای آسان استفاده از حلقه forتو در تو است:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
همانطور که در مثال باال نشان داده شده است با استفاده از یک حلقه ساده forنمیتوان به مقادیر دسترسی یافت بلکه به یک حلقه
forتو در تو نیاز داریم .به زبان ساده در کد باال دو حلقه forداریم .یکی برای به دست آوردن تعداد آرایهها و دیگری برای به دست
آوردن ستون یا تعداد عناصر آرایهها .در اولین حلقه ،forبا استفاده از خاصیت ،countاندیس آرایههای موجود در آرایه numbersکه
در اصل همان تعداد آرایهها میباشد را به دست میآوریم .این خط را میتوان به صورت زیر هم نوشت :
)for(row in 0...2
چرا 0..2؟ چون اندیس آرایهها هم از صفر شروع میشود .یعنی اندیس اولین آرایه دارای اندیس 0و … .در حلقه forدوم با استفاده از
خاصیت ،countتعداد ستونهای یک آرایه را به دست میآوریم .و چون تعداد عناصر یا ستونهای همه آرایهها برابر 5است پس عبارت
numbers[row].countعدد 5را بر میگرداند .در نتیجه خط 11را میتوان به صورت زیر هم نوشت :
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 62
در مجموع میتوان گفت که rowاعداد 1 ،0و 2را در خود جای میدهد و columnهم اعداد 3 ،2 ،1 ،0و .4در نتیجه وقتی که مقدار
ردیف (row) 0باشد ،حلقه دوم از [ ]0[]0تا [ ]0[]4اجرا شود .سپس مقدار هر عنصر از آرایه را با استفاده از حلقه نشان میدهیم ،اگر مقدار
ردیف ) (rowبرابر 0و مقدار ستون ) (columnبرابر 0باشد ،مقدار عنصری که در ستون 1و ردیف (numbers[0][0]) 1قرار دارد نشان
ً
فورا دستورات بعد از آن اجرا خواهند شد ،که در اینجا دستور )( printکه به برنامه اطالع بعد از اینکه دومین حلقه تکرار به پایان رسید،
میدهد که به خط بعد برود (خط .)17سپس حلقه با اضافه کردن یک واحد به مقدار rowاین فرایند را دوباره تکرار میکند .سپس دومین
حلقه forاجرا شده و مقادیر دومین ردیف نمایش داده میشود .حال بیایید آنچه را از قبل یاد گرفتهایم در یک برنامه به کار بریم .این
برنامه نمره چهار درس مربوط به سه دانش آموز را از ما میگیرد و معدل سه دانش آموز را حساب میکند.
Average is 90.00
در برنامه باال یک آرایه دو بعدی از نوع Doubleتعریف شده است (خط .)1این آرایه 3آرایه دارد و هر آرایه 4عنصر .در کل 3دانش
آموز و هر دانش آموز 4درس .همچنین یک متغیر به نام totalتعریف میکنیم که مقدار محاسبه شده معدل هر دانش آموز را در آن
قرار دهیم (خط .)2حال وارد حلقه forتو در تو میشویم (خط .)4در اولین حلقه forتعداد دانش آموزان را با استفاده از خاصیت
countبه دست میآوریم .در نتیجه متغیر studentاعداد 1 ،0و 2را در خود ذخیره میکند .وارد بدنه حلقه forمیشویم .در خط 6
ً
بعدا مشاهده میکنید که چرا این کار را انجام دادیم .سپس برنامه یک پیغام را نشان مقدار متغیر totalرا برابر صفر قرار میدهیم.
میدهد و از شما میخواهد که شماره دانش آموز را وارد کنید (student + 1).عدد 1را به studentاضافه کردهایم تا به جای نمایش
سپس به دومین حلقه forدر خط 10میرسیم .در این حلقه یک متغیر شمارنده به نام gradeتعریف میکنیم و تعداد عناصر آرایه را با
استفاده از studentGrades[student].countرا در آن قرار میدهیم .این متغیر اعداد 2 ،1 ،0و 3را در خود جای میدهد .برنامه
چهار نمره مربوط به دانش آموز را میگیرد .هر وقت که برنامه یک نمره را از کاربر دریافت میکند ،نمره به متغیر totalاضافه میشود.
وقتی همه نمرهها وارد شدند ،متغیر totalهم جمع همه نمرات را نشان میدهد .در خط 17معدل دانش آموز نشان داده میشود.
تابع
توابع به شما اجازه میدهند که یک رفتار یا وظیفه را تعریف کنید و مجموعهای از کدها هستند که در هر جای برنامه میتوان از آنها
استفاده کرد .توابع دارای آرگومانهایی هستند که وظیفه تابع را مشخص میکنند .میتوان یک تابع را در داخل تابع دیگر تعریف کرد.
وقتی که شما در برنامه یک تابع را صدا میزنید برنامه به قسمت تعریف تابع رفته و کدهای آن را اجرا میکند.
گاهی اوقات دو کلمه پارامتر و آرگومان به یک منظور به کار میروند .سادهترین ساختار یک تابع به صورت زیر است :
)(func functionName
{
//code to execute
}
به برنامه ساده زیر توجه کنید .در این برنامه از یک تابع برای چاپ یک پیغام در صفحه نمایش استفاده شده است :
!Hello World
در خطوط 1-4یک تابع تعریف کردهایم .مکان تعریف آن در برنامه مهم نیست .کار این تابع چاپ یک پیغام تعریف است .در تعریف تابع
باال ،ابتدا کلمه کلیدی funcآمده است که نشان دهنده آن است که ما میخواهیم یک تابع تعریف کنیم .نام تابع ما )(printMessage
است.
به این نکته توجه کنید که در نامگذاری تابع از روش کوهان شتری (اولین کلمه با حروف کوچک نوشته میشود و بقیه کلمات با حرف
بزرگ شروع میشوند) استفاده کردهایم .این روش نامگذاری قراردادی است و میتوان از این روش استفاده نکرد ،اما پیشنهاد میشود که
از این روش برای تشخیص توابع استفاده کنید .بهتر است در نامگذاری توابع از کلماتی استفاده شود که کار آن تابع را مشخص میکند
همچنین به عنوان مثال اگر مقدار برگشتی تابع یک مقدار بولی باشد میتوانید اسم تابع خود را به صورت یک کلمه سوالی انتخاب کنید
مانند isLeapyearیا … isTeenagerولی از گذاشتن عالمت سؤال در آخر اسم تابع ،خودداری کنید .دو پرانتزی که بعد از نام میآید،
نشان دهنده آن است که ،نام متعلق به یک تابع است .در این مثال در داخل پرانتزها هیچ چیزی نوشته نشده چون پارامتری ندارد .در
بعد از پرانتزها دو آکوالد قرار میدهیم که بدنه تابع را تشکیل میدهد و کدهایی را که میخواهیم اجرا شوند را در داخل این آکوالدها
مینویسیم .در خط ،6تابعی که ایجاد کردهایم را ،صدا میزنیم .برای صدا زدن یک تابع کافیست نام آن را نوشته و بعد از نام پرانتزها را
قرار دهیم.
اگر تابع دارای پارامتر باشد باید شما آرگومانها را به ترتیب در داخل پرانتزها قرار دهید .در این مورد نیز در درسهای آینده توضیح بیشتری
میدهیم .با صدا زدن یک تابع کدهای داخل بدنه آن اجرا میشوند .برای اجرای تابع )( printMessageبرنامه از خط 6به محل تعریف
تابع )( printMessageمیرود .مثالً وقتی ما تابع )( printMessageرا در خط 6صدا میزنیم برنامه از خط 6به خط ،1یعنی جایی
که تابع تعریف شده میرود و کدهای بدنه آن یعنی خط 3را اجرا میکند.
استفاده قرار بگیرند .در زندگی روزمره فرض کنید که کارمند شما یک تابع است و شما او را صدا میزنید و از او میخواهید که کار یک سند
را به پایان برساند .سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد .سند همان مقدار برگشتی تابع است .نکته
مهم در مورد یک تابع ،مقدار برگشتی و نحوه استفاده شما از آن است .برگشت یک مقدار از یک تابع آسان است .کافیست در تعریف
returnTypeدر اینجا نوع دادهای مقدار برگشتی را مشخص میکند ( Int، Floatو …) .در داخل بدنه تابع کلمه کلیدی returnو
بعد از آن یک مقدار یا عبارتی که نتیجه آن ،یک مقدار است را مینویسیم .نوع این مقدار برگشتی می تواند از انواع ساده و یا اختیاری
بوده و در هنگام نامگذاری تابع و بعد از پرانتزها و عالمت > -ذکر شود .مثال زیر یک تابع که دارای مقدار برگشتی است را نشان میدهد:
Sum is 15.
همانطور که در خط 1مثال فوق مشاهده میکنید ،هنگام تعریف تابع و بعد از عالمت پرانتز بسته ،از -> Intاستفاده کردهایم که نشان
دهنده آن است که تابع ما دارای مقدار برگشتی از نوع اعداد صحیح است .در خطوط 3و 4دو ثابت تعریف و مقدار دهی شدهاند.
توجه کنید که این متغیرها ،متغیرهای محلی هستند .و این بدان معنی است که این متغیرها فقط در تابعی که در آن تعریف شدهاند،
قابل استفاده هستند .در خط 6جمع دو ثابت ،توسط دستور returnبرگشت داده میشود .یک متغیر به نام resultدر خط 9تعریف
تابع )( calculateSumمقدار 15را بر میگرداند که در داخل متغیر resultذخیره میشود .در خط 11مقدار ذخیره شده در متغیر
resultچاپ میشود .تابعی که در این مثال ذکر شد ،تابع کاربردی و مفیدی نیست .با وجودیکه کدهای زیادی در تابع باال نوشته شده
ولی همیشه مقدار برگشتی 15است ،در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 15را به آن اختصاص دهیم .این
تابع در صورتی کارامد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد .هنگامی که میخواهیم در داخل
یک تابع از دستور ifیا switchاستفاده کنیم ،باید خود این دستورات را با کلمه returnبرگشت دهیم .برای درک بهتر این مطلب به
17
18 )"print("Result = \(result).
در خطوط 1-14یک تابع با نام )( getNumberتعریف شده است که از کاربر یک عدد بزرگتر از 10را میخواهد .اگر عدد وارد شده توسط
کاربر درست نباشد تابع مقدار صفر را بر میگرداند .اگر قسمت elseدستور ifو یا دستور returnرا از آن حذف کنیم در هنگام اجرای
چون اگر شرط دستور ifنادرست باشد (کاربر مقداری کمتر از 10را وارد کند) برنامه به قسمت elseمیرود تا مقدار 0را بر گرداند و چون
قسمت elseحذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور returnحذف شود چون برنامه نیاز به مقدار برگشتی
پارامتر و آرگومان
پارامترها ،دادههای خامی هستند که ،تابع آنها را پردازش میکند و سپس اطالعاتی را که به دنبال آن هستید ،در اختیار شما قرار میدهد.
فرض کنید پارامترها مانند اطالعاتی هستند که ،شما به یک کارمند میدهید که بر طبق آنها کارش را به پایان برساند .یک تابع میتواند
هر تعداد پارامتر داشته باشد .هر پارامتر میتواند از انواع مختلف داده باشد .در زیر یک تابع با Nپارامتر نشان داده شده است :
پارامترها ،بعد از نام تابع و بین پرانتزها قرار میگیرند .بر اساس کاری که تابع انجام میدهد ،میتوان تعداد پارامترهای زیادی به تابع
اضافه کرد .بعد از فراخوانی یک تابع باید آرگومانهای آن را نیز تأمین کنید .آرگومانها ،مقادیری هستند که به پارامترها اختصاص داده
میشوند .ترتیب ارسال آرگومانها به پارامترها مهم است .عدم رعایت ترتیب در ارسال آرگومانها باعث به وجود آمدن خطا میشود .اجازه
در برنامه باال یک تابع به نام )(( calculateSumخطوط )1-4تعریف شده است که وظیفه آن جمع مقدار دو عدد است .چون این تابع
مقدار دو عدد صحیح را با هم جمع میکند ،پس نوع برگشتی ما نیز باید Intباشد .تابع دارای دو پارامتر است که اعداد را به آنها ارسال
میکنیم .به نوع دادهای پارامترها توجه کنید .هر دو پارامتر یعنی number1و number2مقادیری از نوع اعداد صحیح ) (Intدریافت
میکنند .در بدنه تابع دستور returnنتیجه جمع دو عدد را بر میگرداند .در داخل خطوط 6-9برنامه از کاربر دو مقدار را درخواست
میکند و آنها را داخل متغیرها قرار میدهد .حال تابع را که آرگومانهای آن را آماده کردهایم فراخوانی میکنیم .مقدار num1به پارامتر اول
و مقدار num2به پارامتر دوم ارسال میشود .حال اگر مکان دو مقدار را هنگام ارسال به تابع تغییر دهیم (یعنی مقدار num2به پارامتر اول
و مقدار num1به پارامتر دوم ارسال شود) هیچ تغییری در نتیجه تابع ندارد چون جمع خاصیت جابه جایی دارد.
فقط به یاد داشته باشید که باید ترتیب ارسال آرگومانها هنگام فراخوانی تابع دقیقاً با ترتیب قرار گیری پارامترها تعریف شده در تابع
مطابقت داشته باشد .بعد از ارسال مقادیر 10و 5به پارامترها ،پارامترها آنها را دریافت میکنند .به این نکته نیز توجه کنید که نام پارامترها
طبق قرارداد به شیوه کوهان شتری یا ( camelCasingحرف اول دومین کلمه بزرگ نوشته میشود) نوشته میشود .در داخل بدنه تابع
(خط )3دو مقدار با هم جمع میشوند و نتیجه به تابع فراخوان (تابعی که تابع )( calculateSumرا فراخوانی میکند) ارسال میشود.
در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده میکنیم ولی در اینجا مشاهده میکنید که میتوان به سادگی نتیجه
جمع را نشان داد (خط )3در خط 6-9از ما دو عدد که قرار است با هم جمع شوند درخواست میشود.
در خط 11تابع )( calculateSumرا فراخوانی میکنیم و دو مقدار صحیح به آن ارسال میکنیم .دو عدد صحیح در داخل تابع با هم
جمع شده و نتیجه آنها برگردانده میشود .مقدار برگشت داده شده از تابع به وسیله تابع )( printنمایش داده میشود (خط .)11در
برنامه زیر یک تابع تعریف شده است که دارای دو پارامتر از دو نوع دادهای مختلف است:
!Hello World
Number = 100
در مثال باال یک تابع تعریف شده است که اولین پارامتر آن مقداری از نوع رشته و دومین پارامتر آن مقداری از نوع Intدریافت میکند.
تابع به سادگی دو مقداری که به آن ارسال شده است را نشان میدهد .در خط 7تابع را اول با یک رشته و سپس یک عدد خاص
فراخوانی میکنیم .حال اگر تابع به یکی از دو صورت زیر فراخوانی میشد :
در برنامه خطا به وجود میآمد .چون در حالت اول ،عدد 100به پارامتری از نوع رشته و رشته !Hello Worldبه پارامتری از نوع اعداد
صحیح ارسال میشد .و در حالت دوم هم ترتیب ارسال آرگومان ها رعایت نشده است .این نشان میدهد که ترتیب ارسال آرگومانها به
پارامترها هنگام فراخوانی تابع ،از لحاظ نوع و پس و پیش بودن ،مهم است.
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 68
ممکن است که این سوال برایتان پیش آمده باشد که آیا هیچ راهی برای ارسال آرگومان ها ،بدون رعایت ترتیب (نه نوع) آنها وجود
ندارد؟ جواب این است که ،امکان ارسال بدون رعایت ترتیب وجود دارد ولی آن هم با شرایطی خاص .به مثال ابتدای درس بر می گردیم
همانطور که مشاهده می کنید ،ما قبل از نام پارامترها از عالمت _ استفاده کرده ایم .این کار باعث می شود که ما در هنگام فراخوانی
تابع ،الزم نباشد که نام پارامترها را ذکر کنیم ،یعنی می توانیم خط 11همین مثال را به صورت زیر بنویسیم:
حال چون پارامترهای این تابع هر دو یکسان و از نوع Intهستند ،در نتیجه خط باال را به صورت زیر هم بنویسیم ،فرقی نمی کند:
در آن مثال دو عدد از نوع Intبه پارامترها ارسال کردیم که ترتیب ارسال آنها چون هر دو پارامتر از یک نوع بودند مهم نبود .ولی اگر
پارامترهای تابع دارای اهداف خاصی باشند ترتیب ارسال آرگومانها مهم است.
در مثال باال ،نشان داده شده است که حتی اگر تابع دو آرگومان با یک نوع دادهای قبول کند ،باز هم بهتر است ترتیب بر اساس تعریف
پارامترها رعایت شود .به عنوان مثال ،در اولین فراخوانی تابع باال اشکالی به چشم نمیآید ،چون سن شخص 20و قد او 160سانتی متر
است .اگر آرگومانها را به ترتیب ارسال نکنیم سن شخص 160و قد او 20سانتی متر میشود که به واقعیت نزدیک نیست .دانستن مبانی
مقادیر برگشتی و ارسال آرگومانها باعث میشود که شما توابع کارآمدتری تعریف کنید .تکه کد زیر نشان میدهد که ،شما حتی میتوانید
5
چون مقدار برگشتی تابع )( myFunctionعدد 5است و به عنوان آرگومان به تابع )( anotherFunctionارسال میشود ،خروجی کد
Variadic Functions
Variadic Functionsامکان ارسال تعداد دلخواه پارامترهای همنوع و ذخیره آنها در یک آرایه ساده را فراهم میآورد .برای ایجاد
تابعی که به تعداد دلخواه پارامتر دریافت کند ،از عالمت سه نقطه )…( به صورت زیر استفاده میشود :
…vaiableName همانطور که در کد باال مشاهده می کنید ،کافیست ،آرگومان هایی که تابع قرار است دریافت کن را به صورت
:dataTypeبنویسید .یعنی یک نام ،سپس نوع متغیرها و در نهایت عالمت … را ذکر کنید .به مثال زیر توجه کنید:
همانطور که در مثال باال مشاهده میکنید ،یک تابع به نام )( CalculateSumدر خط 1تعریف شده است .برای اینکه این تابع تعداد
دلخواه پارامتر دریافت کند ،از عالمت سه نقطه (…) بعد از نوع دادهای پارامتر آن استفاده شده است .در اصل کلمه numbersیک آرایه
است ،که وقتی ما آرگومانها را به تابع ارسال میکنیم ،در این آرایه ذخیره میشوند .حال تابع را سه بار با تعداد مختلف آرگومانها فراخوانی
میکنیم و سپس با استفاده از حلقه forاین آرگومانها را جمع و به تابع فراخوان برگشت میدهیم .وقتی از چندین پارامتر در یک تابع
استفاده میکنید ،فقط یکی از آنها باید دارای عالمت سه نقطه )…( باشد.
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 70
سربارگذاری توابع
سربارگذاری توابع یا ،Function Overloadingبه شما اجازه میدهد که ،دو یا چند تابع با نام یکسان تعریف کنید که ،دارای امضا و
تعداد پارامترهای مختلف هستند .برنامه از روی آرگومانهایی که شما به تابع ارسال میکنید به صورت خودکار تشخیص میدهد که ،کدام
تابع را فراخوانی کردهاید ،یا کدام تابع مد نظر شماست .امضای یک تابع نشان دهنده ترتیب و نوع پارامترهای آن است .به مثال زیر
به این نکته توجه کنید که نوع برگشتی و نام پارامترها شامل امضای تابع نمیشوند .در مثال زیر نمونهای از سربارگذاری توابع آمده است.
در برنامه باال دو تابع با نام مشابه تعریف شدهاند .اگر سربارگذاری تابع توسط Swiftپشتیبانی نمیشد برنامه زمان زیادی برای انتخاب
یک تابع از بین توابعی که فراخوانی میشوند الزم داشت .رازی در نوع پارامترهای تابع نهفته است .کامپایلر بین دو یا چند تابع در صورتی
فرق میگذارد که ،پارامترهای متفاوتی داشته باشند .وقتی یک تابع را فراخوانی میکنیم ،تابع نوع آرگومانها را تشخیص میدهد.
در فراخوانی اول (خط )11ما یک مقدار Doubleرا به تابع )( showMessageارسال کردهایم در نتیجه تابع )(( showMessageخطوط
)1-4که دارای پارامتری از نوع Doubleاجرا میشود .در بار دوم که تابع فراخوانی میشود (خط )12ما یک مقدار Intرا به تابع
)( showMessageارسال میکنیم تابع )(( showMessageخطوط )6-9که دارای پارامتری از نوع Intاست اجرا میشود .معنای اصلی
سربارگذاری تابع همین است که توضیح داده شد .هدف اصلی از سربارگذاری توابع این است که ،بتوان چندین تابع که وظیفه یکسانی
محدوده متغیر
متغیرها در ،Swiftدارای محدوده هستند .محدوده یا scopeیک متغیر ،به شما میگوید که در کجای برنامه میتوان از متغیر استفاده
کرد و یا متغیر قابل دسترسی است .به عنوان مثال ،متغیری که در داخل یک تابع تعریف میشود ،فقط در داخل بدنه تابع قابل دسترسی
است .میتوان دو متغیر با نام یکسان در دو تابع مختلف تعریف کرد .برنامه زیر این ادعا را اثبات میکند :
مشاهده میکنید که ،حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که ،دارای محدودههای متفاوتی باشند ،میتوان به هر کدام از آنها
مقادیر مختلفی اختصاص داد .متغیر تعریف شده در خط 10هیچ ارتباطی به متغیر داخل تابع )( demonstrateScopeدر خط 3ندارد.
وقتی به مبحث کالسها رسیدیم در این باره بیشتر توضیح خواهیم داد.
پارامترهای پیشفرض
پارامترهای پیشفرض همانگونه که از اسمشان پیداست دارای مقادیر پیشفرضی هستند و میتوان به آنها آرگومان ارسال کرد یا نه .اگر به
اینگونه پارامترها ،آرگومانی ارسال نشود از مقادیر پیشفرض استفاده میکنند .به مثال زیر توجه کنید :
تابع )(( PrintMessageخطوط )1-2یک پارامتر اختیاری دارد .برای تعریف یک پارامتر اختیاری میتوان به آسانی و با استفاده از
عالمت = یک مقدار را به یک پارامتر اختصاص داد (مثال باال خط .)1دو بار تابع را فراخوانی میکنیم .در اولین فراخوانی (خط )6ما
آرگومانی به تابع ارسال نمیکنیم بنابراین تابع از مقدار پیشفرض )! (Welcome to Swift Tutorialsاستفاده میکند .در دومین
فراخوانی (خط )7یک پیغام (آرگومان) به تابع ارسال میکنیم که جایگزین مقدار پیشفرض پارامتر میشود .اگر از چندین پارامتر در تابع
استفاده میکنید همه پارامترهای اختیاری را در آخر بقیه پارامترها ذکر بنویسید .دلیل این امر این است که معموال پارامترهایی که آرگومان
w3-farsi.comتخصصی ترین سایت آموزش برنامه نویسی 72
دریافت می کنند ،نسبت به پارامترهای پیشفرض اهمیت بیشتری دارند .در نتیجه برای شفافیت در کدنویسی ،عادت کنید که آنها را قبل