رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

پست های پیشنهاد شده

ارسال شده در (ویرایش شده)

آموزش زبان برنامه‌نویسی سوئیفت - جلسه اول 

مواردی که در این جلسه یاد خواهید گرفت: مقدمه زبان برنامه‌نویسی سوئیفت ، نوشتن اولین دستور و معرفی متغییر‌ها

با سلام و عرض ادب خدمت شما دوستان عزیز و همراهان خوب همیشگی وب‌سایت آیوٌ اِسترِیم. در خدمت شما هستم با یک دوره‌ی جذاب برنامه‌نویسی به زبان سوئیفت! می‌دونم که علاقه‌مندان زیادی به توسعه‌ی محصولات  برنامه برای محصولات شرکت اَپل دارن و از این رو با مشکلاتی هم روبرو هستند که یکیش همین نبود آموزش کامل و به بیانی ساده هستش! مورد دومی هم که خیلی تابلو هستش، همین تَحریمه که به جز اینکه دست قِشر کم‌درآمد جامعه رو بسته شامل تحریم‌های دیگه هم هست. و حالا خیلی‌ها بخاطر علاقه به یادگیری نمی‌تونن محصولات اَپل رو خریداری کنن و شروع کنن به توسعه‌ی محصولات نرم‌افزاری شگفت‌اَنگیز! از این رو تنها یک راه وجود داره اونم استفاده از نسخه‌ی هک‌شده‌ی سیستم عامل مَک هستش که به شما امکان استفاده از امکانات یک سیستم‌عامل مَک واقعی رو میده! البته هدف بنده این نیست که بگم استفاده از این روش خوبه! بلکه برای آن دسته از عزیزانی که توانایی خریدن مَک‌بوک و یا سایر محصولات اَپل رو ندارن گفتم وگرنه اگه توانایی خرید دارید که بهترین راهش همینه که بخرید و لذت یک سیستم‌عامل متفاوت و جدید رو داشته باشید :)). 

خُب،‌ بریم سر اصل مطلب! اینکه در این دوره‌ی آموزش چه چیز‌هایی رو یاد می‌گیرد،‌ فقط و فقط سه چیز هست؛ 

  1. مقدمات یادگیری Syntax ( سِینتَکس) زبان و کدنویسی مقدماتی 
  2. یادگیری ‌رابط‌کاربری ( User Interface ) 
  3. ایجاد یک پروژه‌ی ساده ماشین‌حساب 

و بعد از این مباحث هم کُلیت کار دستتون میاد و به راحتی ‌می‌تونید از منابعی مُعتبر،‌ دانش و مهارت خودتون رو بالا ببرید. 

زبان برنامه‌نویسی سوئیفت ( Swift ) چیست ؟

سوئیفت یک زبان‌ برنامه‌نویسی از نوع کامپایلری برای توسعه محصولات نرم‌افزاری macOS , iOS , watchOS و tvOS که توسط شرکت اَپل ساخته شده است. قبل از این از زبان برنامه‌نویسی Objective-C برای توسعه محصولات برای موارد ذِکر شده استفاده می‌شد که بعد از آن این زبان جایش را به سوئیفت داد اما همچنان از Objective-C هم استفاده می‌شود. هدف در اینجا آموزش زبان است و شما می‌توانید برای توضیحات بیشتر به این اینجا مراجعه کنید. 

شروع کد‌نویسی

برای شروع کدنویسی به زبان‌برنامه‌نویسی سوئیفت می‌تونید از یک برنامه‌ موبایل هم حتی استفاده کنید! البته تنها در بخش مقدماتی. نام این نرم‌افزار موبایلی Sedona Swift Compiler است که می‌تونید از فروشگاه Play دانلود و نصب کنید. یا از نرم‌افزار‌ی ساده بر روی ویندوز خود کُد‌نویسی را شروع کنید که هم‌ این‌کار هم برای لینوکس صِدق می‌کند که با نصب یک بسته می‌توانید در لینوکس هم کُد‌نویسی با این زبان شیرین را شروع کنید. یا در نهایت اگر مَک‌بوک دارید که چه بهتر و اگر ندارید از نسخه‌ی هک‌شده‌ی آن استفاده کنید که عرض کردم در موقعی که واقعا چاره‌ای ندارید!.

اولین چیز در هر زبان برنامه‌نویسی که آموزش داده می‌شود؛ هِلوُ وُرلد (‌ !Hello World ) خودمونه😃!. پس این کُد ساده رو ببیند که چقدر قَشنگ این پیغام رو در کُنسول چاپ می‌کنه:‌

print("Hello World!")

به همین سادگی که مشاهده کردید، با استفاده از متد print پیغام Hello World رو چاپ کردیم. اگر این دستور رو اجرا کنید، با همین پیغام در کُنسول مواجه میشید. پس این تابع برای چاپ مقادیر در سوئیفت هستش. شاید دقت کرده باشید که سِمی‌کالُن نذاشتم! سوئیفت این اجازه‌ رو میده که بدون گذاشتن سِمی‌کالُن برناممون رو اجرا کنیم که البته بذارید هم مشکلی پیش نمی‌آید، مگر در موقعی که چندین دستور در یک خط داشته باشید که اون موقع واجب میشه! تابع print یک تابع سراسری در سوئیفت هستش که چندین آرگومانت دریافت می‌کنه و اساس کارش، چاپ اطلاعاتی هستش که بهش میدیم. و حالا یه سری آرگومانت‌های پیش‌فرض‌ هم میگیره که می‌تونیم بسته به نیاز اون‌ها را تغییر بدیم.

در اولین آرگومانت، ما تا هر چند‌تا مقادیر یا همان آیتم‌ها که بخواهیم می‌توانیم وارد کنیم و در خروجی نمایش دهیم. به این شکل که می‌بینید:

print("www.iostream.ir", "www.fanoox.com", item3, item4, ...)

در آرگومانت دوم، که separator هستش، می‌توانیم مشخص کنیم که اگر دارای چندین آیتم اطلاعات بودیم، در بین هر کدام از این اطلاعات، چه نمادی/علامتی قرار گیرد؟. که ما می‌تونیم اون نماد/علامت رو در بین دو "" مشخص کنیم. به عنوان مثال:‌

print("www.iostream.ir", "www.fanoox.com", separator : " :)) ") // Output the ==> www.iostream.ir :)) www.fanoox.com

هما‌نطور که مشاهده کردید، می‌توانیم از هر نماد/علامتی که دوست داشتیم در بین انبوهی از داده‌ها استفاده کنیم. 

در آرگومانت سوم، می‌توانیم مشخص کنیم که اطلاعات به خط بعدی ( new line ) یا در همان خط فعلی چاپ شوند یا خیر که به صورت زیر است:

print("www.iostream.ir", terminator : "")
print("www.fanoox.com")
/*Output the => www.iostream.ir www.fanoox.com 
that not of include is new line */

در حالت پیش‌فرض تابع به صورت "terminator : "\n هستش که به معنی در " در پایان چاپ اطلاعات، اطلاعات دیگر را که بعد از این مقادیر چاپ‌شده می‌آیند را چاپ کن ". 

 

 برای تعریف متغییر در سوئیفت به دو صورت می‌تونید عمل کنید:

  1. تعریف متغییر بدون تعیین نوع 
  2. تعریف متغییر با تعیین نوع 

همچنین ما دو نوع متغییر داریم:

  1. متغییری که مقدارش می‌تونه در ادامه‌ی برنامه تغییر کنه
  2. متغییر که مقدارش فقط در هنگام تعریف مشخص و قابل تغییر در سراسر برنامه نیست ( ثابت‌ها )

برای تعریف متغییر بدون نوع به این صورت عمل می‌کنیم:‌

var website_name = "www.iostream.ir"
print(website_name) // or print("The website name is \(website_name)")

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

var website_name = "www.iostream.ir"
print(type(of : website_name )) // or print("Type is => \(type(of : website_name )") 
// Result => String 

به شما مقدار  String یا همان رشته‌ای را می‌دهد. اما در حالت تعیین نوع برای متغییر به این صورت است:

var website_name : String = "www.iostream.ir"
print(webiste_name) // or print("The website_name is \(website_name)")

که شما صراحتا نوع را مشخص کردید و کامپایلر در اینجا و در ادامه‌ی برنامه‌ی مقدار غیری از String را قبول نمی‌کند. همان‌طور که مشاهده می‌‌کنید،‌ برای تعریف نوع برای متغییر باید از دو کالُن ( : )‌ استفاده کنیم و سپس حرف اول نوع متغییر را بزرگ بنویسم ( البته در این زبان ) مانند؛‌  Int و سپس با گذاشتن علامت انتساب ( = ) مقدار مورد نظر خود را به آن بدهیم. نکته‌ای دیگری که وجود دارد در چاپ کردن مقادیر است که شما می‌توانید با دو روش فوق که ذکر شده‌ است، مقادیر را چاپ کنید که یکی بصورت آیتم به آیتم یعنی print( item1, item2, item3 , ...) و تا هر چند آیتم را که حاوی مقادیر هستند به خروجی بفرستید و نمایش دهید و اما در حالت دوم باید  Syntax متفاوتی استفاده کنید و آن هم ادغام رشته با مقادیر متغییر‌هاست! که مثالش را بالا برای شما عزیزان زده‌ام و مقادیر متغییر‌ها باید بین دو پرانتز و قبل پرانتز از یک بک‌اسلش رو به عقب استفاده کنید!‌.  و اما بریم سراغ ثابت‌‌ها! از اسم این متغییر‌ها پیداست که یک بار تعریف می‌شوند و مقدار ثابتی دریافت می‌کنند و در ادامه‌ی برنامه و یا رَوند پُروژه هیج تغییری نمی‌کنند و در طول برنامه یا پروژه مقادیرشون ثابته! بیاید با یک مثال شروع کنیم؛ ثابت‌ها در سوئیفت با کلمه‌ی کلید let تعریف می‌شوند و همانند متغییر‌ها شامل نام و نوع هم می‌شوند: 

let _website_name = "www.iostream.ir"
_webiste_name = "iostream.ir" // Error , beacuse it's a constant  
print(_website_name) // or print("The website name => \(_website_name)")

هما‌نطور که می‌بینید، تغییر دادن مقادیر ثابت‌ها باعث بروز خطا میشه و اجازه‌ی چنین کاری به شما داده نمیشه. و برای تعریف با تعیین نوع هم به این شکل عمل می‌کنیم:

let _number : Int = 20
_number = 40 // Error , beacuse it's a constant  
print(_number) // or print("The number => \(_number)")

تا همین‌جا کفایت می‌کنه و تا شما یک قهوه نوش‌جان کنید و این کد‌ها رو آزمایش کنید و همچنین از صِحَت نتیجه اطمینان حاصل کنید، منم یه کوچولو استراحت می‌کنم و جلسه‌ی دوم رو که شامل نحوه‌ی نام‌گذاری صحیح برای متغییر‌ها و ثابت‌ها و نام‌گذاری‌های مجاز و همچنین یکم بحث رو می‌کشونیم سمت دستورات شرطی و حلقه‌ها. امیدوارم این جلسه از دوره‌ی آموزش زبان برنامه‌نویسی سوئیفت مورد رضایت شما عزیزان واقع شده باشه. هر سوال و ابهامی داشتید، می‌تونید کامنت کنید تا براتون توضیح بدم. در پناه حق، هر کجای کشور عزیزمون ایران هستید، شاد، سرافراز و موفقیت روز‌افزون داشته باشید. 

ویرایش شده در توسط سید محمد عباسی
اضافه کردن جزئیات

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آموزش زبان برنامه‌نویسی سوئیفت - جلسه دوم

مواردی که در این جلسه یاد خواهید گرفت: نحوه‌ی نام‌گذاری متغییر‌ها ، نام‌گذاری صحیح و مجاز متغییر‌ها و دستورات شرطی

در این جلسه که جلسه‌ی دوم از دوره‌ی آموزش زبان برنامه‌نویسی سوئیفت هستش، شما با نحوه نام‌گذاری متغییر‌ها، نام‌گذاری صحیح متغییر‌ها، دستورات شرطی و حلقه‌ها آشنا میشید و بعدش باید حسابی تمرین کنید که ریز به ریز همه‌چیز رو متوجه بشید و بدونید که هر مطلبی رو که باید برای بهتر کردن مهارت‌های خودتون مطالعه کنید و عمل نکنید، در واقع هم به زودی مطلب از ذهنتون پاک میشه و هم اینکه وقت و انرژی شما گرفته میشه! خُب، بریم که وقت شما عزیزان رو بیشتر از این نگیرم و آموزش رو شروع کنیم.

نحوه‌ی نام‌گذاری صحیح متغییر‌ها 

نحوه‌ی نام‌گذاری متغییر‌ها در هر پروژه‌ی نرم‌افزاری از اهمیت زیادی برخوردار هستش! چرا که هم پروژه‌ی شما روی نظم و قانون پیش میره و هم این که اگه روزی خودتون یا یه بنده‌ خدای دیگه‌ای خواست در توسعه‌ی پروژه همکاری کنه، با دیدن نام‌های عجیب و غریب متغییر‌ها روبرو نشه و ندونه هر کدون از این متغییر‌ها کجا استفاده شدند! حالا جدا از اینکه یک‌سری استاندارد‌ها دیگه هم در کدنویسی باید رعایت بشه (‌ کُد تَمیز )‌ که دیگه بستگی به خود شما و تَجربتون داره. 

نکته‌ها:

  • نام‌گذاری کارکتر‌ها شامل تمامی کارکتر‌های یونیکد ( مُجاز )‌ است. مانند ( 🙂 یا 😉 و ایمُوجی دیگر ) می‌باشد.
  • نام متغییر‌ها و ثابت‌ها نمی‌توانند شامل فضای خالی ( " " )، نماده‌های ریاضی ( +,-,/ و .. )، علامت‌‌ها ( {}.(),&,^ و .. ) , کارکتر‌های غیر‌مجاز باشند.

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

  • نگارش شُتری ( camelCase )
  • نگارش پاسکال ( PascalCase )
  • نگارش ماری ( snake_case ) 

این سه از پرکاربرترین سبک‌های نگارش توی برنامه‌نویسی و نام‌گذاری اونا هستند. البته نگارش‌های دیگه‌ای هم هستند که همونطور که گفتم، اینا جز پرکاربردترین و معروفت‌ترین هستند توی برنامه‌نویسی که البته به شَخصه نگارش ماری رو بیشتر دوست دارم! بریم و یه مثال از هر کدوم بزنیم:‌

نگارش شُتری ( camelCase )

var webSite = "www.iostream.ir" // Or with type var webSite : String = "www.iostream.ir"
print(webSite)
// Also the constant 
let webName = "www.iostream.ir" // Or with type let webName : String = "www.iostream.ir"
print(webName)

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

نگارش پاسکال ( PascalCase )

var WebSite = "www.iostream.ir" // Or with type var WebSite : String = "www.iostream.ir" 
print(WebSite)
// Also the constant 
let WebName = "www.iostream.ir" // Or with type let WebName : String = "www.iostream.ir"
print(WebName)

در این نگارش هم همین‌طور که مشاهده می‌کنید، حرف اول دوم و الی آخر ..  هر کلمه باید بزرگ باشه. 

نگارش کبابی ( snake_case ) به به عجب کبابی😀! 

var web_site = "www.iostream.ir" // Or with type var web_site : String = "www.iostream.ir" 
print(web_site)
// Also the constant 
let _web_name = "www.iostream.ir" // Or with type let web_name : String = "www.iostream.ir"
print(_web_name)

توی این نگارش، اسامی متغییر‌ها اگر دارای چندین کلمه‌ باشند باید توسط یک آندرِلاین ( ـ ) از یک دیگر جدا شوند و همچنین باید با حروف کوچک نوشته شوند. 

اگه دقت کرده باشید، متوجه شدید که من از نام‌های بی‌ربط و گیج‌کننده استفاده نکردم! بطور مثال هر کسی با دیدن متغییری با نام web_site متوجه خواهد شد که این متغییر مربوط به وب‌سایت است که می‌توانست به این شکل باشد،   w , x , we  و اینطور اسامی که گیج‌کننده هستند. حتی مثال بالا (‌ web_site ) می‌توانست بهتر از این نیز باشد،  web_site_iostream که هر چقدر اسامی متغییر‌ها واضح‌تر و اصولی‌تر باشد، خوانایی کد‌های شما و استاندارد پروژه‌ی شما بالا می‌رود که البته کار اول را که درست انجام بدید، باقی کار‌ها هم روی استانداد‌های اصولی پیش میره! البته این نظر خود بنده هستش🙂

دستورات شرطی 

 اگه دستورات شرطی نباشن فقط می‌تونین یه برنامه‌ی فِسقلی بنویسید! در واقع یه برنامه‌ی ساده و در حَد چاپ اطلاعات و دستوراتی حُول همین محور. اما در پروژه‌های بزرگ نبود دستورات شرطی یعنی عذاب!‌‌ یه توضیح کوتاه میدم و شروع به کد‌نویسی می‌کنیم که البته این دوره بر این مبنا شروع شده که شما اطلاعات پایه‌ای از برنامه‌نویسی دارید و نیازی به توضیحات زیاد درمورد دستورات پایه ندارید. 

دستورات شرطی رو یک دو راهه در نظر بگیرید! اینکه یه تابلو زده شده سمت راست و نوشته که راه موفقیت شما از این طرفه و طرف دیگه نوشته این راه منجر به موفق نشدن شما میشه! حالا نوبت ذهن شماست که تصمیم بگیره کدوم طرفی بره! مطمعنن کسی نمی‌خواد موفق نشه، درسته؟‌ پس دو راهه نقش شرط و ذهن شما نقش مترجم یا کامپایلر رو بازی می‌کنه با این تفاوت که ما حق انتخاب داریم ولی توی برنامه‌نویسی ما حق انتخاب رو مشخص می‌کنیم و کامپایلر اون چیزی رو که ما صحیح دونستیم اجرا می‌کنه. با این تعریف فکر کنم متوجه شده باشید، پس بریم سر شرط دوست‌داشتنی ‌if!

 در زبان‌های مختلف، تعریف و استفاده از دستورات شرطی و یا سایر دستورات پایه تفاوت‌هایی با هم دارن و درمورد سوئیفت هم همین قانون صدق می‌کنه! اینکه سوئیفت از سینتَکس ساده و  زیبایی برای تعریف دستورات استفاده می‌کنه که با سایر زبان‌ها تفاوت‌های ریزی داره! تعریف دستور ‌if در سوئیفت به این شکل هستش:‌

var boolean : Bool = true
if boolean == true
{
   print(" Okay , This is boolean => \(boolean)")
}

در این تعریف همون‌طور که مشاهده می‌کنید، شرط if نیازی به پَرانتِز نداره و فقط شرط جلوی اون قرار می‌گیره و در صورت درست بودن دستورات داخل بدنه ‌{} اجرا خواهند شد. این نکته رو هم در نظر داشته باشید بر خلاف زبان‌های دیگر، باید حتما اکولاد‌ها  {} رو بذارید‌، حتی اگه یک شرط باشه! چون سینتَکس و نحوه‌ی تعریف اون به همین شکل هستش. 

اما اگه شرط برقرار نبود و خواستیم دستور دیگه‌ای رو اجرا کنیم، از else، دوست خوب if استفاده می‌کنیم: 

var boolean : Bool = true
if boolean == true
{
   print(" Okay , This is boolean => \(boolean)")
}
else
{
   print(" This is not boolean! => \(boolean)")
}

در اینجا اگر شرط اول برقرار نشد، یعنی boolean مقدارش false بود، else اجرا و پیغام This is not boolean به همراه مقدار متغییر boolean نمایش داده می‌شود. 

در مواقعی هم می‌خواهیم چند شرط داشته باشیم! یعنی که اگر شرط اول برقرار نبود، شرط دوم و اگر شرط دوم برقرار نبود شرط سوم و الی آخر .. که به این صورت عمل می‌کنیم:

let ـweb_site_name = "www.iostream.ir"
if web_site_name == "www.iostream.ir"
{
   print("This is web site => \(ـweb_site_name)")
}
else if ـweb_site_name == "www.google.com"
{
   print("This is not web site!")
}
else if ـweb_site_name == "www.microsoft.com"
{
   print("This is not web site!")
{
else 
{
    print("None")
}

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

 

دستور شرطی بعدی هم که خیلی دِلش می‌خواد زودتر معرفیش کنم، Switch هستش!

این دستور یک مقدار قبول می‌کنه و بعدش توسط بچه‌هاش ( case ) به بررسی اونا می‌پردازه که نحوه‌ی تعریف اون به این شکل هستش: 

let web_site_name = "www.iostream.ir"
switch web_site_name 
{
  case "www.iostream.ir":
    print("This is web site => \(web_site_name)")
  case "www.google.com":
    print("This is not web site!") 
   .
   .
   .
   .
   default:
   print("None")
}

switch در اینجا نقش همون  if رو بازی می‌کنه با این تفاوت که بررسی‌ها در بدنه و توسط caseهایی که داره صورت می‌گیره که case اول میگه اگه متغییر web_site_name برابر وب‌سایت www.iostream.ir بود،‌ بیا و چاپ کن This is web site => web_site_name و به همین صورت caseهای دیگه که در صورتی که  case قبلی با مقدار موجود در switch برابر نبود، case بعدی اجرا میشه و در آخر شما می‌تونید مثل دستور شرطی else  اگه هیچ‌کدوم از شرط‌ها ( در اینجا caseها ) برقرار نبود، چاپ کن None یا هیچ‌کدام!. 

خُب عزیزان، این دستورات رو که در این جلسه که درواقع جلسه‌ی دوم از این دوره هستش رو تمرین کنید تا توی ‌ذهنتون جا بیُفته و بتونید به راحتی کار کنید تا در جلسات بعد به بررسی حلقه‌ها، انواع نوع‌های داده، آپِریتِر‌ها بپردازیم و همین‌طور مباحث مقدماتی رو جلو ببریم. امیدوارم که این جلسه برای شما مفید واقع شده باشه و بهترین استفاده رو از این‌ جلسه برده باشید. منتظر جلسه‎ی سوم باشید. 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آموزش زبان برنامه‌نویسی سوئیفت - جلسه سوم

مواردی که در این جلسه یاد خواهید گرفت: انواع داده و حلقه‌ها

جلسه‌ی سوم رو اختصاص میدیم به بحث انواع داده و حلقه‌ها. در زبان برنامه‌‌نویسی سوئیفت ما با انواعی از داده روبرو هستیم! که البته طبق دیگر زبان‌های برنامه‌نویسی انواع  نوع داده پرکابرد رو معرفی می‌کنیم و همچنین دیگر نوع‌های داده رو در ادامه بازگو می‌کنیم که شما با دقت بتونید در پروژه‌های خودتون نوع‌های داده‌ی خودتون رو انتخاب کنید. همچنین باید در نظر داشته باشید که در هر پروژه‌ی نرم‌افزاری به کار بردن نوع‌های داده‌‌ای که اصلا شاید ضروری نباشه و با یه نوع داده‌ی دیگه که حافظه‌ای به مراتب کمتر از نوع داده‌ی قبلی که تعریف کردید بگیره، کارتون راه بیفته. در هر صورت در انتخاب نوع‌های داده در پروژه‌های خودتون نهایت دقت رو به خرج بدید! کِی دوست نداره که پروژه‌ای کارآمد و بهینه داشته باشه که هر توسعه‌ دهنده‌ای با دیدن نظم و بهینه بودن پروژه‌اش چَه‌چَه و بَه‌بَه بزنه؟!. درمورد حلقه‌ها هم یک توضیح مختصر بدم و بریم سراغ کُد‌نویسی. 

همه‌ی ما در برنامه‌نویسی نیاز داریم که چندین خط کد رو بنویسم تا در نهایت برنامه‌ی ما به خوبی و خوشی اجرا بشه‌، البته اگه بقیه‌ی قسمت‌های کُد‌هاتون دُرست کار کنه! اما همین چند خط کد رو مثلا چاپ اعداد ۰ تا ۱۰ هستش، پس ما کُد‌های ما به این صورت باید باشه:

print(0)
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)

اُووو! این همه کُد! حالا فکر کنید از ۰ تا ۱۰۰۰ باید به همین شکل کُد بنویسید! کاری با خُطوط کُدها و حتی منطقی‌ بودنش هم نداریم! اما واقعا حوصله، زمان و انرژیتون چی میشه؟ پس راه‌حل چیه؟! آفرین! حلقه‌ها، این مشکل رو به سادگی و زیبایی هر چه تمام‌ترحل کردند. پس مثال بالا رو با یک حلقه می‌نویسیم:

for index in 0...5
{
   print(index) // Output => 0,1,2,3,4,5
}

فقط با چندین خط کُد این مشکل حل شد! حالا شما می‌تونید به‌ جای عدد ۵، عدد ۱۰۰۰ یا بیشتر رو قرار بدید. پس متوجه شدید که کاربرد حلقه‌ها چقدر مهم هستن، و برای تکرار دستوراتی هستند که داده‌های زیادی رو دارند و عملا بدون حلقه‌ها باید کُد‌های زیادی بنویسید تا این داده‌ها نمایش داده بشن!.

انواع داده

در سوئیفت، ما با انواعی از داده سر و کار داریم که عبارت‌اند از:

انواع داده‌ی صحیح و اعشاری

Int۸: نوع داده‌ی عددی ۸بیت است، یعنی اینکه فقط توانایی ‌ذخیره ۱‌بایت را دارد. و مقادیر ۱۲۷ تا ۱۲۷- را پوشش می‌دهد.

UInt8: این نوع داده عددی  فقط و فقط یک مقدار از ۰ تا ۲۵۵ را پوشش خواهد داد و ۱‌بایت است. که در واقع از نام کوتاه‌ شده‌ی Unsigned Integer می‌آید، و به معنای نوع بدون علامت ( -‌ ) است.

Int۳۲:  این نوع داده ۴‌بایتی (‌ ۴ *‌ ۸ ) است، و مقداری از ۲۱۴۷۴۸۳۶۴۷ تا ۲۱۴۷۴۸۳۶۴۷- را پوشش می‌دهد. 

UInt32: مانند UInt8، است، با این تفاوت که فقط مقادیر صحیح بدون علامت ( - ) را قبول می‌کند و ۴‌بایت است. از مقدار ۰ تا ۴۲۹۴۹۶۷۲۹۵ را پوشش می‌دهد. 

Int۶۴: ‌مقداری بیشتر در خود ذخیره می‌کند! و ۸‌بایت است. یعنی اینکه مقدار عددی بیشتری تا ۲۰ رقم عدد صحیح با علامت ( + ) و بدون علامت ( - ) را ذخیره می‌کند. از مقدار ۹۲۲۳۳۷۲۰۳۳۶۸۵۴۷۷۵۸۰۸ تا ۹۲۲۳۳۷۲۰۳۳۶۸۵۴۷۷۵۸۰۸- را پوشش می‌دهد. 

UInt۶۴: مقادیری بیشتر ذخیره می‌کند که فقط شامل اعداد صحیح بدون علامت ( - ) است و ۸‌بایتی است. از مقدار ۰ تا ۱۸۴۴۶۷۴۴۰۷۳۷۰۹۵۵۱۶۱۵ را پوشش می‌دهد.

Float: این نوع داده‌ی اعشاری است و شامل ۴‌بایت است. مقادیر اعشاری از ۱.۲E-38 تا ۳.۴E-38 را پوشش می‌دهد( تا ۶ رقم اعشار ). البته این اعدا و این نوع نوشتاری، نماد‌های علمی هستند!.

Double: اعشاری با تفاوت اینکه فضای بیشتری را در اختیارمان می‌گذارد و همین‌طور دقت بالایی را هم در محاسبات به همراه دارد. ۸‌بایتی است و از مقدار ۲.۳E-308 تا ۱.۷E+308 را پوشش می‌دهد ( تا ۱۵ رقم اعشار ).

خُب، برای هر کدام یک مثال می‌زنیم: 

var int_8_byte : Int8 = -50
print(int_8_byte)
var uint_8_byte : UInt8 = 50
print(uint_8_byte)
var int_32_byte : Int32 = -560
print(int_32_byte)
var uint_32_byte : UInt32 = 560
print(uint_32_byte)
var int_64_byte : Int64 = -1567
print(int_64_byte) 
var uint_64_byte : UInt64 = 1567
var float : Float = 18.5
print(float)
var double : Double = 19.75
print(double)

 این کُد‌ها رو در اِدیتور یا IDE خودتون وارد و اجرا کنید تا نتیجه رو بصورت زنده مشاهد کنید. در این میان، دقت کنید که نوع داده‌ی خودتون رو به درستی در پروژه‌های نرم‌افزاری استفاده کنید و طبق نیاز پروژتون از داده‌ی مورد نیاز استفاده کنید. به عنوان مثال، یک قسمتی از برنامه‌ی شما نیاز به داده‌ی به اندازه‌ی ۸‌بایت داره، ولی شما میاید و یه داده‌ی ۶۴‌بایتی تعریف می‌کنید برای اون! می‌دونید چقدر از حافظَتون بدون مصرف و اِشغال‌شده باقی ‌می‌مونه؟! پس دقت کنید. 

نوع داده‌ی بُولیَن ( Boolean )

این نوع داده دو مقدار True یا False می‌گیره. از این نوع داده بیشتر در دستورات شرطی استفاده میشه و قسمت‌هایی از برنامه که نیاز به بررسی و دُرستی یا نادُرستی یک عبارت داره. نحوه‌ی تعریف و استفاده از اون هم به این شکل هستش:

let _boolean : Bool = true // Or false
print(_boolean)

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

نوع داده‌های رشته‌ای و کارکتری

String:  یک دنباله‌ای از رشته ( همان متن ) را در خود ذخیره می‌کند. مانند: 

let _web_site_iostream : String = "www.iostream.ir"
print(_web_site_iostream)

Character: فقط و فقط یک کارکتر را قبول می‌کند( به جز کارکتر‌های کنترلی ). مانند:

let _character : Character = "i"
let _character_control : Character = "\n"
print(_character) // Output => i
print(_character_control) // Output => new line

همون‌طور که مشاهده کردید، چندین نوع‌ داده‌ در زبان برنامه‌نویسی سوئیفت وجود دارد که شما باید با توجه به پروژه‌ی خودتان از آن‌ها استفاده‌ی درست کنید!. 

حلقه‌ها و انواع آن 

حلقه‌ها در سوئیفت به طور متفاوتی تعریف می‌شوند، اما همه‌ی آن‌ها کار یکسانی انجام می‌دهند! یعنی تکرار دستورات. حلقه‌ی اول، for هستش: 

for index in 0...5
{
  print(index)
}

در این تعریف همان‌طور که مشاهده می‌کنید، با تعریف کلمه‌ی کلید for و بعد از آن یک نام دلخواه و معنی‌دار برای اینکه مقادیر هر بار در آن ذخیره شوند (‌ در واقع نقش یک متغییر را بازی می‌کند ) و بعد کلمه‌ی کلید in و در نهایت باید یک رِنج از یک عدد تا یک عدد دیگر انتخاب کنیم که بین این‌ها با سه نقط ( ...‌ )‌ از هم جدا می‌شوند! این به این معنی است که در این تعریف عدد اولی که تعیین می‌شود، تا عدد دوم به صورت کامل اعداد در ‌index ذخیره شده و هیچ کَم و کَسری مانند یک ‌ایندِکس کم شود، ندارد. 

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

for index in 0..<5
{
  print(index)
}

در این صورت با آپِریِتر > می‌توانیم یک عدد و تکرار کمتر داشته باشیم. 

اگر بخواهیم درمورد آرایه که در جلسات دیگر صحبت می‌کنیم، یک مثال بزنیم، به این صورت هست:

let _array_number = [10,20,30,40]
for index in _array_number
{
 print(index)
}

 همان‌طور که می‌بینید، تعریف و استفاده از حلقه‌ی for به چه زیبایی و آسانی است. 

حلقه‌ی while، حلقه‌ی دومی هستش که به معرفی اون می‌پردازیم. این حلقه به این صورت تعریف می‌شود:

var number : Int8 = 0
while (number < 10)
{
  print(number)
  number += 1
}

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

در نهایت، حلقه‌ی آخر، حلقه‌ی repeat هستش که کارکرد اون دقیقا همانند حلقه‌ی do, while هستش! نحوه‌ی تعریف و استفاده از اون به این شکل است: 

var repeat : Int8 = 0
repeat {
print(repeat)
  repeat += 1
} while repeat < 1

در این حلقه، بدنه‌ی حلقه که شامل دستورات هستند ابتدا اجرا می‌شود و سپس شرط بررسی می‌شود! درست همانند do, while. این حلقه با کلمه‌ی کلید repeat تعریف شده و سپس در بین آکولاد‌ها (‌ {} ) دستورات نوشته می‌شوند و بعد از آخرین آکولاد ( { ) جلوی آن و یا بعد آن کلمه‌ی کلید while و سپس شرط را می‌نویسم. البته بدون پَرانتِز!. البته این دستور فقط یک بار اجرا خواهد شد! چرا که متغییر repeat کوچکتر از ۱ نیست، بزرگتر از آن هم نیست و در واقع مساوی است ( مقدار repeat در همان وهَله‌ی اول یک بار افزایش میابد و مقدار ۱ را درون خود ذخیره می‌کند). پس شرط نادرست از آب در می‌آید و حلقه دیگر اجرا نخواهد شد. 

نکته:‌ دقت کنید که در تمامی حلقه‌ها نیاز به آکولاد باز و بسته برای تعریف دستورات است و شما نمی‌توانید بدون تعریف این آکولاد‌ها کُد‌های خودتان را بنویسید! پس دقت کنید. به جزء حلقه‌ی while دیگر حلقه‌ها نیازی به پَرانتِز () برای تعریف شرط، ندارند.

این جلسه هم به پایان رسید و در جلسات بعد به مباحث بیشتر و کمی جزئیات بیشتر می‌پردازیم که به دانش شما اضافه‌تر شده باشه. 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آموزش زبان برنامه‌نویسی سوئیفت - جلسه چهارم

مواردی که در این جلسه یاد خواهید گرفت: کامنت‌ها، دو ویژگی نوع‌های داده Int، آپِریِتر‌ها ( Operators )، کلمات کلیدی break,continue,fallthrough

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

کامنت‌ها

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

  • برای غیر‌فعال کردن موقتی یک قسمت/بخش از کُد
  • برای توضیح دادن یک قسمت/بخش از کُد برای دیگر برنامه‌نویسان/توسعه‌دهندگان
  • یا توضیح کُد برای اینکه در مراجعات بعدی به کُدهای پروژه کارکرد هر قسمت از برنامه را متوجه شوید

انواع کامنت‌ها در زبان برنامه‌‌نویسی سوئیفت:

  • تَک خطی (‌ single-line )
  • چند خطی ( multi-line )

در کامنت تَک خطی، با گذاشتن دو علامت // می‌توانید توضیحات خود را فقط در همان خط درمورد کُد مورد نظر بنویسید و بعد از آن کامنت شما در واقع در حال تعریف دستور جدید هستید! به این مثال دقت کنید:

let _web_site_name : String = "www.iostream.ir"
print(_web_site_name) // Ouput the string of www.iostream.ir

 در مثال بالا همان‌طور که مشاهده می‌کنید از کامنت تَک خطی استفاده کردیم، و بعد از این کامنت شما نمی‌توانید انتظار داشته باشید که در خط جدید دوباره حالت کامنت‌گذاری برای شما همچنان فعال باشد! چرا که در بعدی دستوری جدید داریم نه کامنتی ادامه‌ی کامنت قبل!.

و اما کامنت چند خطی که اسمش هم روشه، تا هر چند‌تا خط تا موقعی که آخر کامنت رو نَبسته باشید، می‌تونید توضیحات بنویسید. به مثال زیر دقت کنید:

let _web_site_name : String = "www.iostream.ir"
/* We can also use
from of
print("String.. and \(_web_site_name)") */
print(_web_site_name) 

در مثال بالا که مشاهده می‌کنید، شما هیچ محدودیتی برای اضافه کردن توضیحات بیشتر برای کُد‌های خود ندارید و تا هر چند خط توضیحات می‌توانید استفاده کنید.

دو ویژگی نوع داده‌ی Int

 اگر بخواهیم کوچک‌ترین و بزرگ‌ترین عدد موجود از نوع داده‌ی Int را بدست آوریم، از دو ویژگی max,min استفاده می‌کنیم. هر دو ویژگی به همراه مثال در زیر آورده شده‌اند:

print("Max => \(Int.max)") 
print("Min => \(Int.min)")

با اجرای کد‌های بالا،‌ بزرگترین مقدار موجود نوع داده‌ی  Int و همچنین کوچک‌ترین آن به شما نمایش داده می‌شود.

آپِریِتر‌ها (‌ Operators )  

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

در سوئیفت این 8 دسته آپرِیِتر وجود دارد:

  • آپِریِتر‌ اِنتسابی ( Assigment Operator )
  • آپرِیِتر‌های محاسباتی ( Arithmetic Oprerator ) 
  • آپِریِتر‌ باقی‌مانده ( Remainder Operator ) 
  • آپِریِتر‌های مُرکب ( Compound Assigment Operator ) 
  • آپِریِتر‌های مقایسه‌ای ( Comparison Operators ) 
  • آپِریِتر ترِنِری ( Ternary Conditonal Operators )
  • آپِریِتر دامِنه ( Range Operator )
  • آپِریِتر‌های منطقی ( Logical Operators )

این‌ها، کل آپِریِتر‌ها در سوئیفت هستند که هر کدام عمل مخصوص به خود را انجام می‌دهند. در مثال‌های زیر هر کدام از این آپِریِتر‌ها را به همراه مثال برای شما آورده‌ایم.

آپِریِتر‌های اِنتسابی ( Assigment Operator )

 در کل اینکه ما یک مقداری را به متغییری انتساب می‌دهیم، عملا داریم از آپِریِتر‌‌ انتساب ( = ) استفاده می‌کنیم. چرا که کُدنویسی از سمت چپ شروع می‌شود و کاملا منطقی هم هست که مقدار دهی به یک متغییر از سمت چپ صورت می‌گیرد که مقدار سمت راست قرار می‌گیرد، با استفاده از آپِریِتر انتساب (‌ = ) در مابین مقدار و نام و نوع متغییر قرار می‌گیرد و عمل انتساب مقدار به متغییر را انجام می‌دهد. به مثال زیر دقت کنید:

let _web_site_name : String = "www.iostream.ir"
   //  Assigment Operator ( = )
print("Type of \(type(of : _web_site_name ) and the website of name \(_web_site_name)")

 در مثال بالا مشاهده می‌کنید که با استفاده از آپِریَتر انتساب (‌ = )‌، مقدار www.iostream.ir که یک مقدار رشته‌ای/متنی است را در متغیر web_site_name ذخیره می‌کنیم.

در خط بعد هم نوع متغییر و مقدار موجود در متغییر web_site_name ذخیره نمایش می‌دهیم.

آپرِیِتر‌های محاسباتی ( Arithmetic Oprerator ) 

در قسمت‌هایی از پروژه شده که ما باید محاسباتی رو انجام بدیم. این کار با استفاده از آپِریِتر‌های محاسباتی ( Arithmetic Operator ) صورت می‌گیرند. این آپِریِتر‌ها شامل: +،-،/،* و ٪ است. 

برای هر کدام از این آپریِترها، مثال‌هایی در زیر آورده شده است:

آپِریِتر + 

var number_one, number_two : Int8
number_one = 50 
number_two = 50
print("Result = > ", number_one + number_two) // Output the number 100

در مثال بالا همان طور که مشاهده می‌کنید، ابتدا دوم متغییر با نوع Int8 تعریف کرده و سپس در خطوط بعد به آن‌ها مقادیر ۵۰ را داده‌ایم. در نهایت عمل جمع ( + ) را روی آن‌ها به صورت مستقیم انجام و نمایش می‌دهیم. یا ساده‌تر بخواهیم تعریف کنیم، آپِریِتر ( + ) عمل جمع کردن اعداد و یا متصل کردن دو رشته را بر عهده دارد:

var web_site_name, platform_name : String
web_site_name = " www.iostream.ir :)"
platform_name = " www.fanoox.com  ;)"
print("Binding two string => ", web_site_name + platform_name) // Ouput the website name and platform name => www.iostream.ir :) www.fanoox.com ;)

و به همین راحتی می‌توانید تا بی‌نهایت عمل جمع و متصل کردن رشته‌ها را انجام دهید. تنها نکته‌ای که باید توجه داشته باشید این است که سوئیفت در برخورد با اعداد و این آپِریَتر، آن عبارت را محاسباتی در نظر می‌گیرد و در برخورد دو تا چند رشته، آن عبارت را عمل متصل کردن و الحالق ( concatentation ) در نظر می‌گیرد. 

آپِریِتر -

این آپِریِتر برای کم کردن دو مقدار عددی از هم استفاده می‌شود، همان‌طور که در مثال زیر مشاهده می‌کنید:

var number_one, number_two : Int8
number_one = 80
number_two = 30
print("Result => ", number_one - number_two) // Output the number 50

مثال بالا به خوبی نشان می‌دهد که دو مقدار ۸۰ و ۳۰ از هم کم شده با استفاده از آپِریِتر ( - ) و در نتیجه، خروجی برابر ۵۰ خواهد بود.

آپِریِتر * 

این آپِریِتر عمل ضرب کردن دو عدد را انجام می‌دهد، به مثال زیر دقت کنید:

var number_one, number_two : Int8
number_one = 50
number_two = 20
print("Result => ", number_one * number_two) // Output the number 1000

آپِریِتر ( *‌ ) عمل ضَرب را انجام می‌دهد و نباید به حرف ( x ) که شبیه به ضرب در ریاضیات است اشتباه گرفته شود. 

آپِریِتر /

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

var number_one, number_two : Double
number_one = 50.0
number_two = 20.0
print("Result => ", number_one / number_two) // Output the number 2.5

در محاسباتی که عمل تقسیم را انجام می‌دهیم باید به این نکته دقت کنیم که اگر پروژه‌ی ما عملا برای محاسبات کار خاصی است باید از نوع داده‌ی Double یا Float استفاده کنیم که البته در محاسبات معمولی، نوع داده‌ی Float جواب‌گوی نیاز ما هم هست، اما در محاسباتی که نیاز به دقت بالایی دارند باید از نوع داده‌ی  Double استفاده کنیم. 

آپِریِتر ٪ 

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

یک مثال در زیر ببینید تا متوجه کارکرد این آپِریِتر شوید:

var number_one, number_two : Int8
number_one = 10
number_two = 2
print("Result => ", number_one % number_two) // Output the number 0

اگر جزئی بخواهیم وارد شویم به این صورت است که ابتدا عدد ۱۰ بر ۲ تقسیم ( آپِریِتر / ) شده و سپس حاصلی که بدست می‌آید ۵ است و سپس همین ۵ دوباره تقسیم بر ۲ شده و ۲ بدست می‌آید و در اینجا ۲ ٪ ۲ می‌شود ۰.

آپِریِتر باقی‌مانده ( Reminder Operator ) 

این آپِریِتر همان‌طور که در بالا و در قسمت آپِریِتر‌های محاسباتی قرار گرفته بود، کار محاسبه‌ی باقی‌مانده‌ی دو عدد را انجام می‌دهد:

var number_one, number_two : Int8
number_one = 10
number_two = 2
print("Result => ", number_one % number_two) // Output the number 0

 

آپِریِتر‌های مُرکب ( Compound Assigment Operator ) 

که شامل عبارت‌های کوتاه‌شده یا به اصطلاح میانبُری برای عمل انتساب و محاسبه را فراهم می‌کند که شامل: =+،=-،=*،=/،=٪ است. در زیر توضیح مختصر به همراه یک مثال آورده شده است.

آپِریِتر =+

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

var number_one : Int8 = 50
number_one += 50
print("Result =>", number_one) // Output the number 100

 در خط دوم که ما با آن کار داریم، متغییر number_one به علاوه‌ی مقدار قبلی خودش، مقدار ۵۰ را هم به آن اضافه کرده و در نهایت در خود متغییر  number_one ذخیره و نتیجه ۱۰۰ نمایش داده می‌شود. که بدون استفاده از میانبُر، به این شکل بود:

var number_one : Int8 = 50
number_one = number_one + 50
print("Result =>", number_one) // Output the number 100

 حتی می‌توانیم برای اتصال یک رشته به رشته‌ی دیگر استفاده کنیم:

var web_site_name : String = "www.iostream.ir :) "
web_site_name += " www.fanoox.com ;) "
print("Result =>" web_site_name) // Ouput the web site of name => www.iostream.ir :) www.fanoox.com ;)

که بدون استفاده از میانبُر به این شکل نوشته می‌شُد:

var _web_site_name_and_platform_name : String = "www.iostream.ir :) " + " www.fanoox.com ;) "
print("Result => ", _web_site_name_and_platform_name) // Ouput the web site of name and platform name => www.iostream.ir :) www.fanoox.com ;) 

آپِریِتر =- 

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

var number : Int8 = 80 
number -= 30
print("Result =>", number) // Ouput the number 50

مقدار ۸۰ که مقدار فعلی متغییر number است، از مقدار ۳۰ که در سمت راست متغییر قرار دارد، کم می‌شود و در نهایت مقدار ۵۰ در همان متغییر یعنی ‌number ذخیره می‌شود.

آپِریِتر =*

عمل ضرب و انتساب مقدار سمت راستی در مقدار فعلی متغییر سمت چپ را انجام می‌دهد. به مثال زیر دقت کنید:

var number : Int8 = 80
number *= 30
print("Result =>", number) // Ouput the number 2400

آپِریِتر =/

مشابه آپِریِتر تقسیم ( / )‌، عمل تقسیم و انتساب آن به متغییر سمت چپ انجام می‌دهد. به مثال زیر دقت کنید:

var number : Int8 = 10
number /= 2
print("Result =>", number) // Ouput the number 5

آپِریِتر =٪ 

عمل باقی‌مانده‌ی دو عدد که شامل مقدار فعلی متغییر سمت چپ و مقدار سمت را است را محاسبه کرده و در متغییر سمت چپ ذخیره می‌کند. به مثال زیر دقت کنید:

var number : Int8 = 10
number ٪= 5
print("Result =>", number) // Ouput the number 0

 

 آپِریِتر‌های مقایسه‌ای ( Comparison Operators ) 

برای مقایسه‌ی بین دو مقدار و در نتیجه برگرداندن مقدار True یا False مورد استفاده قرار می‌گیرند. بیشترین استفاده‌ی آنها در شرط‌هاست، اما می‌توان به صورت مستقیم هم از آن‌‌ها هم استفاده کرد. این آپِریِتر‌ها شامل ==،=!،>،<،=<،=>،==!،=== است. برای هر کدام مثالی در زیر آورده شده است. 

آپِریِتر == 

برای مقایسه دو مقدار استفاده می‌کنیم که مقدار در صورتی که مقادیر دو طرف مساوی باشند، مقدار True و در غیر اینصورت مقدار  False برگشت داده می‌شود. به مثال زیر دقت کنید:

print("True and False => ", 2 == 2) // Output the true 
print("True and False => ", 2 == 3) // Output the false

در مثال بالا چونکه ۲ با ۲ برابر است،‌ مقدار  نمایش داده شده،‌ true است. و در خط بعدی چونکه مقدار ۲ برابر با ۳ نیست،‌ مقدار false نمایش داده می‌شود.همچنین می‌توانید در شرط‌ها و حلقه‌ها هم استفاده کنید:

if 2 == 2 {
  print("Ok!")
}else {
   print("NO!")
}
// Ouput the string Ok!

آپِریِتر =!

اگر مقدار برابر با مقدار مقابل خودش نبود، نتیجه true و در غیر اینصورت نتیجه false خواهد بود. علامت ! ( نَقیض )‌ دقیقا معنا و مفهوم ( == ) را عوض می‌کند. به مثال زیر دقت کنید:

 

print("True and False => ", 2 != 3) // Output the true 
print("True and False => ", 2 != 2) // Output the false

در مثال بالا، ۲ مساوی ۳ نیست و این درست است. در خط بعدی ۲ مساوی با ۲ نیست که این درست نیست و مساوی هستش،‌ پس نتیجه false است.

آپِریِتر >

اگر مقدار سمت چپ کوچکتر از مقدار سمت راست بود، نتیجه true و در غیر اینصورت نتیجه false است. به مثال زیر دقت کنید:‌

print("The operator ( < ) => ", 1 < 2) // Output the boolean true 
print("The operator ( < ) => ", 2 < 1) // Output the boolean false

آپِریِتر <‌  

اگر مقدار سمت چپ بزرگتر از مقدار سمت راست بود، نتیجه true و در غیر اینصورت نتیجه false است. به مثال زیر دقت کنید:

print("The operator ( > ) => ", 1 > 2) // Output the boolean false
print("The operator ( > ) => ", 2 > 1) // Output the boolean true

آپِریِتر =<

اگر مقدار سمت چپ، بزرگتر یا مساوی مقدار سمت راست بود، نتیجه true  است، در غیر اینصورت، نتیجه false خواهد بود. به مثال زیر دقت کنید:

print("The operator ( >= ) => ", 1 >= 1) // Output the boolean true 
print("The operator ( >= ) => ", 1 >= 2) // Output the boolean false

آپِریِتر =>

اگر مقدار سمت چپ، کوچکتر یا مساوی مقدار سمت راست بود، نتیجه true  است، در غیر اینصورت، نتیجه false خواهد بود. به مثال زیر دقت کنید:

print("The operator ( <= ) => ", 1 <= 2) // Output the boolean false
print("The operator ( <= ) => ", 1 <= 1) // Output the boolean true

نکته:‌ اولویت آپِریِتر مساوی (‌ = ) در این مورد بالا‌تر از آپِریِتر < یا > است و بنابر این در حلقه‌ها اگر این این آپِریِتر باشد، مبنا بر همین آپِریِتر قرار می‌گیرد. 

 

آپِریِتر === 

این آپِریِتر برای مقایسه‌ی دو شئ ( object ) استفاده می‌شود. اگر هر دو شئ از یک مرجع ( refrence ) بودند یا به عبارت دیگر شئ‌های ساخته شده در حافظه‌ی به نام Heap با تمام ویژگی‌ها و متغییر‌‌ها نگه‌داری می‌شوند و اگر شئ دیگر از همان حافظه‌ای که یک شئ دیگر استفاده می‌کند باشد، این آپِریِتر درمورد آن دو شئ نتیجه‌ی true و در غیر اینصورت نتیجه‌ی false را نمایش می‌دهد. در مبحث شئ‌گرایی بیشتر در این مورد صحبت ‌می‌کنیم،‌ در حال حاضر فقط همین را بدانید، کافیست. به مثال زیر دقت کنید:

class WebsitePlatform {
  var web_site_name, platform_name : String
  init(web_name : String, platform : String) {
    self.web_site_name = web_name
    self.platform_name = platform
  }
}
let _web_site_and_plat_form_one = WebSitePlatform(web_name : "www.iostream.ir", platform : "www.fanoox.com")
let _web_site_and_plat_form_two = WebSitePlatform(web_name : "www.iostream.ir", platform : "www.fanoox.com")
if _web_site_and_plat_form_one === _web_site_and_plat_form_two {
   print("This is refrence!")
}else {
   print("No,this is not refrence!")
}

اگر این کُد را خروجی بگیرید، به شما پیغام NO, this is not refrence را می‌دهد. چرا که هر دو شئ به صورت جداگانه در حافظه‌ی Heap ذخیره شده‌اند و هیچ‌کدام به دیگر کاری ندارد و به اصطلاح با هم ارتباطی ندارند و هر یک کَشک خودش را می‌سابد. و اگر ما بیایم به این شکل عمل کنیم، آنوقت دیگر یک ارجاع داریم به شئ‌ای مشخص: 

class WebsitePlatform {
  var web_site_name, platform_name : String
  init(web_name : String, platform : String) {
    self.web_site_name = web_name
    self.platform_name = platform
  }
}
let _web_site_and_plat_form_one = WebSitePlatform(web_name : "www.iostream.ir", platform : "www.fanoox.com")
let _web_site_and_plat_form_two = _web_site_and_plat_form_one
if _web_site_and_plat_form_one === _web_site_and_plat_form_two {
   print("This is refrence!")
}else {
   print("No,this is not refrence!")
}

به جای ایجاد شئ جدید، همان شئ اول را به متغییر دوم انتساب می‌دهیم که الان در واقع دو شئ داریم که شئ دومی به شئ اولی اشاره می‌کند و حالا باید این دو شئ، دوتایی کَشک بسابن! یعنی اینکه الان دوتایی به هم در ارتباطن و شئ دومی ارجاعیست به شئ اول. نتیجه خروجی هم This is refrence است.

آپِریِتر ==!

اگر دو شئ از یک مرجع نبودند، و هر کدام در حافظه‌ای جداگانه نگه‌داری می‌شدند، نتیجه به صورت true و اگر دو شئ‌ از یک مرجع بودند، نتیجه false خواهد بود. کاملا برعکس آپِریِتر (‌ ===‌ ). به مثال زیر دقت کنید:

class WebsitePlatform {
  var web_site_name, platform_name : String
  init(web_name : String, platform : String) {
    self.web_site_name = web_name
    self.platform_name = platform
  }
}
let _web_site_and_plat_form_one = WebSitePlatform(web_name : "www.iostream.ir", platform : "www.fanoox.com")
let _web_site_and_plat_form_two = WebSitePlatform(web_name : "www.iostream.ir", platform : "www.fanoox.com")
if _web_site_and_plat_form_one !== _web_site_and_plat_form_two {
   print("This is refrence!")
}else {
   print("No,this is not refrence!")
}

مثال بالا هم که کاملا واضح است! اینکه اگر دو شئ با هم ارجاعی نداشتند، پس نتیجه طبق این آپِریِتر true است و در غیر اینصورت اگر ارجاع داشتند، نتجیه false و شرط آخر اجرا خواهد شد که No, this is not refrence  است. 

آپِریِتر ترِنِری ( Ternary Conditonal Operators )

سه تا قسمت داره:

  1. مسئله/شرط
  2. مقدار اول
  3. مقدار دوم

شرط در ابتدا قرار می‌گیره و سپس به دنبال آن آپِریِتر ? و بعد از آن جواب اول در صورت درست بودن شرط که برگشت داده می‌شود و علامت کالُن ( : ) در صورتی که نتیجه نادرست یا false باشد در شرط، مقدار بعد از کالُن/دونقطه ( : ) برگشت داده می‌شود. به مثال زیر دقت کنید:

let _web_site_name_and_platform_name : String = 2 > 1? "www.iostream.ir" : "www.fanoox.com"
print("Result =>", _web_site_name_and_platform_name) // Output the www.iostream.ir

در مثال بالا همان‌طور که مشاهده می‌کنید، ابتدا شرط/مسئله قرار می‌گیرد و سپس مقدار بعد آپِریِتر ? و مقدار اول و دوم که با کالُن ( : ) از هم جدا می‌شوند. در این مثال نتیجه،  www.iostream.ir است، چرا که ۲ بزرگتر از ۱ است و این از لحاض منقطی نتیجه‌ی true دارد. 

آپِریِتر دامِنه ( Range Operator ) 

این آپِریِتر در حلقه‌ها استفاده می‌شود و نحوه‌ی کار آن‌ را در جلسات قبل توضیح داده‌ام:

for index_number_one in 0...20 {
 print(index_number_one, separator : " ",terminator : "") // Output the number 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
}
for index_number_two in 0..<20 {
   print(index_number_two, separator : " ",terminator : "") // Output the number 0 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19
}

 

آپِریِتر‌های منطقی ( Logical Operators )

شامل آپِریِتر‌های !،&&،|| است. که بیشتر استفاده‌ی آن‌ها در حلقه‌هاست، اما شما می‌توانید در هر جایی از پروژه‌ی خودتان که نیاز به این آپِریِتر‌ها داشتید، به صورت مستقیم استفاده کنید. 

آپِریِتر ! ( نَقیض ) 

کار این آپِریِتر، برعکس کردن یا نَقیض کردن یک مقدار هستش که ممکنه true یا false باشه. به عنوان مثال اگه مقدار متغییری true بود و این آپِریِتر رو در ابتدای اون مقدار قرار دادید، خروجی برابر است با false. و همین مورد هم برعکس صدق می‌کند، یعنی اگر شما مقدار متغییری false داشتید، با گذاشتن این عبارت در ابتدای متغییر، نتیجه true می‌شود. 

این مثال زیر را ببینید:

var is_name_web_site_iostream : Bool = false 
print(!is_name_web_site_iostream) // Output the bool true 
is_name_web_site_iostream = true 
print(!is_web_site_iostream) // Output the bool false

آپِریِتر && 

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

let web_site_name, platform_name : String 
web_site_name = "www.iostream.ir" 
platform_name = "www.fanoox.com"
if web_site_name == "www.iostream.ir" && platform_name == "www.fanoox.com" {
  print(web_site_name, platform_name)
} else {
   print("None")
}

اگر در مثال بالا، هر دو شرط مبنی بر اینکه دو مقدار متغییر تعریف شده باید برابر با مقدار تعیین شده در شرط باشند تا مقادیر چاپ شوند. در غیر اینصورت با خروجی None روبرور خواهیم شد. 

آپِریِتر ||

این یکی زیاد گیر نمیده که حالا حتما باید هر دو شرط با هم برقرار باشن! یکی از شرط‌ها در بین چندین شرط که برقرار باشه و به عبارتی نتیجه درست (‌ true ) برگردونه، وارد بدنه‌ی شرطه میشه و دستورات رو اجرا می‌کنه. اگه تمامی شرط‌ها نادرست (‌ false ) بودند، دستورات داخل بدنه اجرا نخواهند شد. به مثال زیر دقت کنید:

var web_site_name, platform_name : String 
web_site_name = "www.iostream.ir" 
platform_name = "www.fanoox.com"
if web_site_name == "www.iostream.ir" || platform_name == "www.fanoox.ir" {
  print(web_site_name, platform_name)
} else {
   print("None")
}

در مثال بالا شرط دوم برقرار نیست! چرا که متغییر platform_name با مقدار سمت راست آن برابر نیست. اما از آنجایی که از آپرِیِتر ||‌ استفاده کردیم، پس شرط اول درست بوده و دستورات داخل بدنه‌ی شرط if اجرا می‌شوند. 

کلمات کلیدی continue,break,fallthrough

کلمه‌ی کلید continue 
اگر بخواهیم در یک حلقه در یک جایی به بعد دستورات اجرا نشوند و مجددا حلقه اجرا شود، از این کلمه‌ی کلید کمک می‌گیرم. به مثال زیر دقت کنید:
for index in 0...20 {
  if index == 5 {
        continue
    }
  print(index)
}
/* Output the number 
0
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*/

همان‌طور که مثال بالا مشاهده‌ کردید، در حلقه‌ی for شرط داخل حلقه بر این مبنا بود که اگر متغییر index مساوی مقدار ۵ شد، ادامه‌ی دستورات را ادامه نده ( continue ) و مجدد حلقه را از سر بگیر. بخاطر همین است که عدد ۵ نمایش داده نشده. 

کلمه‌ی کلید break 

با این کلمه‌ی کلید به راحتی می‌توانید هر جایی از حلقه که دیگر نیازی نداشتید که حلقه ادامه ندهد، با این کلمه کلید حلقه را متوقف یا به اصطلاح بشکنید!. با این کار دیگر حلقه تکرار نشده و دستورات بعد از حلقه اجرا خواهند شد. به مثال زیر دقت کنید:

for index in 0...5 {
   if index == 2 {
      break
   }
   print(index)
}
/* Output the number 
0
1 
*/

کلمه‌ی کلید fallthrough 

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

let _number : Int8 = 1
switch _number {
   case 2:
     print(2)
   case 1: 
     print(1)
    fallthrough 
   case 3: 
     print(3)
    fallthrough
    default:
      print("None")
}

بعد از هر caseی که می‌خواهید اجرا شود باید این کلمه‌ی کلید را قرار دهید. 

 

منتظر جلسه‌ی پنجم این دوره‌ی آموزشی باشید. 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...