آشنایی با سوئیفت (بخش اول)
فهرست مطالب
آخرین به روزرسانی در 21/10/2022
در این مقاله قصد شروع آشنایی با سوئیف را داریم.
آشنایی با سوئیفت در دو بخش ارائه می شود که بتوانیم تقریبا تمامی اصول اولیه ی این زبان را شرح دهیم.
سوئیفت یکی از مهم ترین و اصلی ترین زبان های برنامه نویسی برای IOS می باشد که برای این پیاده سازی پلتفرم های با این سیستم عامل مورد استفاده قرار می گیرد.
با ما همراه باشید تا در ادامه جزئیات کاملی را این زبان را شرح دهیم.
آشنایی با سوئیفت
قبل از هر چیزی اجازه دهید یک آشنایی و یک معرفی ابتدایی با سوئیفت داشته باشیم که ببینیم این زبان به چه صورتی به ما کمک می کند.
لازم به ذکر است ورژن سوئیفتی که ما در این مقاله در نظر می گیریم سوئیفت ۴ می باشد.
Swift 4 یک زبان برنامه نویسی جدید است که توسط Apple Inc برای توسعه iOS و OS X توسعه یافته است.
سوئیفت ۴ بهترین های C و Objective-C را بدون محدودیت های سازگاری C به کار می گیرد.
اولین نسخه عمومی سوئیفت در سال ۲۰۱۰ منتشر شد.
تقریباً ۱۴ سال طول کشید تا کریس لاتنر اولین نسخه رسمی را ارائه کند و بعداً توسط بسیاری از همکاران دیگر پشتیبانی شد.
سوئیفت ۴ در Xcode 6 بتا گنجانده شده است.
لازم به ذکر است که طراحان سوئیفت از زبان های مختلف دیگر مانند Objective-C، Rust، Haskell، Ruby، Python، C# و CLU ایده گرفتند.
سوئیفت یک زبان برنامه نویسی متن باز، همه منظوره و کامپایل شده است.
این یک زبان برنامه نویسی استاتیک تایپ شده است.
هر مقدار دارای یک نوع اختصاص داده شده است.
نوع یک مقدار زمانی که به عنوان آرگومان استفاده می شود یا در زمان کامپایل برگردانده می شود ، همیشه بررسی می شود.
و اگر عدم تطابق وجود داشته باشد، برنامه کامپایل نمی شود.
کامپایلر Swift ماشین LLVM است و در Xcode، IDE استانداردی که برای کار با توسعه نرم افزار اپل استفاده می شود، گنجانده شده است.
Swift یک زبان برنامه نویسی مدرن است که برای هماهنگ شدن در اکوسیستمی طراحی شده است که قبلا برای یک زبان برنامه نویسی متفاوت به نام Objective-C طراحی شده بود.
اکثر نرمافزارهایی که امروزه روی آیفون و مک اجرا میشوند، حتی برای برنامههای رسمی اپل، بر اساس کد Objective-C هستند، اگرچه استفاده از سوئیفت سال به سال بیشتر مورد توجه قرار میگیرد، و در حالی که Objective-C سالها برای حفظ و بهبود موجود استفاده خواهد شد.
برنامههای کاربردی، احتمالاً برنامههای جدیدی با سوئیفت ایجاد خواهند شد.
قبل از اینکه اپل سوئیفت را معرفی کند ، Objective-C به شدت برای معرفی قابلیتها و ویژگیهای جدید توسعه یافته بود ، اما در سالهای اخیر این تلاش به نفع توسعه سوئیفت بسیار کاهش یافته است.
این بدان معنا نیست که Objective-C مرده است یا ارزش یادگیری ندارد : Objective-C هنوز یک ابزار ضروری برای هر توسعه دهنده اپل است.
تنها در ۶ سال، سوئیفت ۵ نسخه اصلی را پشت سر گذاشته است.
سوئیفت یک زبان همه منظوره است که با مفاهیم مدرن ساخته شده است و آینده روشنی دارد.
ویژگی های سوئیفت
- از الگوهای برنامه نویسی ایمن استفاده می کند.
- ویژگی های برنامه نویسی مدرن را ارائه می دهد.
- سینتکس Objective-C را ارائه می کند.
- روشی فوق العاده برای نوشتن برنامه های iOS و OS X است.
- دسترسی یکپارچه به چارچوب های موجود کاکائو را فراهم می کند.
- بخش های رویه ای و شی گرا زبان را یکسان می کند.
- برای پشتیبانی از عملکردهایی مانند ورودی/خروجی یا مدیریت رشته نیازی به وارد کردن کتابخانه جداگانه ندارد.
- منبع باز است و یادگیری آن آسان است.
- سوئیفت سریع، ایمن و رسا است.
محیط سوئیفت
Swift 4 یک پلتفرم Playground را برای اهداف یادگیری فراهم می کند و ما نیز همان را راه اندازی می کنیم.
برای شروع کدنویسی Swift 4 در Playground به نرم افزار xCode نیاز دارید.
هنگامی که با مفاهیم Swift 4 را به صورت کامل آموختید ، همچنان می توانید از xCode IDE برای توسعه برنامه iOS/OS x استفاده کنید.
برای شروع، ما در نظر می گیریم که شما در حال حاضر یک حساب کاربری در وب سایت Apple Developer دارید.
پس از ورود به سیستم ، به لینک زیر بروید :
در این قسمت تعدادی از نرم افزارهای موجود به شرح زیر فهرست می شود :
اکنون xCode را انتخاب کرده و با کلیک بر روی لینک داده شده نزدیک به disc image آن را دانلود کنید.
پس از دانلود فایل dmg، می توانید آن را با دوبار کلیک بر روی آن و دنبال کردن دستورالعمل های داده شده نصب کنید.
در نهایت، دستورالعمل های داده شده را دنبال کنید و نماد xCode را در پوشه Application رها کنید.
اکنون xCode را روی دستگاه خود نصب کرده اید.
سپس Xcode را از پوشه Application باز کنید و پس از پذیرفتن شرایط و ضوابط اقدام کنید.
اگر همه چیز به درستی پیش رفته باشد، صفحه زیر را خواهید دید.
گزینه Get start with a playground را انتخاب کنید و نامی برای زمین بازی وارد کنید و iOS را به عنوان پلتفرم انتخاب کنید.
در نهایت، پنجره Playground را به صورت زیر دریافت خواهید کرد :
در زیر کد گرفته شده از پنجره پیش فرض Swift 4 Playground آمده است.
import UIKit
var str = "Hello, playground"
اگر همان برنامه را برای برنامه OS X ایجاد کنید، شامل import Cocoa می شود و برنامه به شکل زیر خواهد بود :
import Cocoa
var str = "Hello, playground"
هنگامی که برنامه بالا بارگذاری می شود، باید نتیجه زیر را در Playground result area (سمت راست) نمایش دهد.
Hello, playground
سینتکس های پایه در سوئیفت
ما قبلاً یک قطعه از برنامه سوئیفت ۴ را هنگام تنظیم محیط دیده بودیم.
بیایید یک بار دیگر با !Hello, World زیر شروع کنیم.
برنامه ای که برای playground OS X ایجاد شده است، که شامل import Cocoa است که در زیر نشان داده شده است :
/* My first program in Swift 4 */
var myString = "Hello, World!"
print(myString)
اگر همان برنامه را برای playground iOS ایجاد کنید، آنگاه شامل import UIKit می شود و برنامه به شکل زیر خواهد بود :
import UIKit
var myString = "Hello, World!"
print(myString)
هنگامی که برنامه فوق را با استفاده از یک playground مناسب اجرا می کنیم، نتیجه زیر را دریافت می کنیم :
Hello, World!
اجازه دهید اکنون ساختار اصلی یک برنامه سوئیفت ۴ را ببینیم تا درک ساختارهای اساسی زبان برنامه نویسی سویفت ۴ برای شما آسان باشد.
ایمپورت کردن در سوئیفت ۴
می توانید از دستور import برای وارد کردن هر چارچوب Objective-C (یا کتابخانه C) به طور مستقیم به برنامه Swift 4 خود استفاده کنید.
برای مثال، عبارت import cocoa فوق، تمام کتابخانههای Cocoa، APIها و زمانهای اجرا را که لایه توسعه را برای همه OS X تشکیل میدهند، در سوئیفت ۴ در دسترس قرار میدهد.
cocoa در Objective-C که یک ابر مجموعه از C است پیاده سازی شده است، بنابراین به راحتی می توان C و حتی C++ را در برنامه های Swift 4 خود ترکیب کرد.
توکن ها در سوئیفت ۴
یک برنامه Swift 4 از توکن های مختلفی تشکیل شده است و یک identifier یا یک keyword ، یک constant ، یک string literal یا یک symbol است.
به عنوان مثال، عبارت Swift 4 زیر از سه tokens تشکیل شده است :
print("test!")
The individual tokens are:
print("test!")
کامنت ها
کامنت ها مانند متون کمکی در برنامه Swift 4 شما هستند.
آنها توسط کامپایلر نادیده گرفته می شوند.
نظرات چند خطی با /* شروع می شود و با کاراکترهای */ خاتمه می یابد همانطور که در زیر نشان داده شده است.
/* My first program in Swift 4 */
Semicolons
سوئیفت ۴ نیازی به تایپ نیم ویرگول (;) پس از هر عبارت در کد خود ندارد، اگرچه اختیاری است.
و اگر از نقطه ویرگول استفاده می کنید، کامپایلر به آن ایرادی نمی گیرد.
با این حال، اگر از چندین دستور در یک خط استفاده می کنید، باید از نقطه ویرگول به عنوان جداکننده استفاده کنید، در غیر این صورت کامپایلر یک خطای سینتکس ایجاد می کند.
/* My first program in Swift 4 */
var myString = "Hello, World!"; print(myString)
شناسه ها
شناسه Swift 4 نامی است که برای شناسایی یک متغیر، تابع یا هر آیتم دیگری که توسط کاربر تعریف شده است استفاده می شود.
یک شناسه با حروف الفبای A تا Z یا از a تا z یا underscore _ به دنبال آن صفر یا بیشتر حروف ، underscore و ارقام (0 تا 9) شروع می شود.
سوئیفت 4 کاراکترهای خاصی مانند @، $ و % را در شناسهها مجاز نمیداند.
این زبان یک زبان برنامه نویسی حساس به حروف بزرگ و کوچک است.
Azad zara abc move_name a_123
myname50 _temp j a23b9 retVal
برای استفاده از یک کلمه تعریف شده به عنوان یک شناسه ، باید یک بک تیک (`) قبل و بعد از آن قرار دهید.
به عنوان مثال، class یک شناسه معتبر نیست، اما `class` معتبر است.
کلید واژه ها
کلمات کلیدی زیر در Swift 4 تعریف شدهاند.
این کلمات تعریف شده را نمیتوان بهعنوان ثابت یا متغیر یا هر نام شناسه دیگری استفاده کرد، مگر اینکه با بکتیکها از آنها خارج شوند.
کلمات کلیدی مورد استفاده در declarations
Class | deinit | Enum | extension |
Func | import | Init | internal |
Let | operator | private | protocol |
public | static | struct | subscript |
typealias | var |
کلمات کلیدی مورد استفاده در statements
break | case | continue | default |
do | else | fallthrough | for |
if | in | return | switch |
where | while |
کلمات کلیدی مورد استفاده در عبارات (expressions) و types
as | dynamicType | false | is |
nil | self | Self | super |
true | _COLUMN_ | _FILE_ | _FUNCTION_ |
_LINE_ |
کلمات کلیدی مورد استفاده در particular contexts
associativity | convenience | dynamic | didSet |
final | get | infix | inout |
lazy | left | mutating | none |
nonmutating | optional | override | postfix |
precedence | prefix | Protocol | required |
right | set | Type | unowned |
weak | willSet |
Whitespaces
خطی که فقط حاوی فضای خالی است ، احتمالاً با یک comment ، به عنوان یک خط خالی شناخته می شود ، و یک کامپایلر سوئیفت 4 کاملاً آن را نادیده می گیرد.
فضای سفید یا همان Whitespaces اصطلاحی است که در سوئیفت 4 برای توصیف جاهای خالی، برگهها، newline characters و کامنت ها استفاده میشود.
فضاهای خالی یک قسمت از یک دستور را از قسمت دیگر جدا می کند و کامپایلر را قادر می سازد تا مشخص کند که یک عنصر در یک عبارت، مانند int، کجا به پایان می رسد و عنصر بعدی در کجا شروع می شود. بنابراین ، در عبارت زیر :
var age
باید حداقل یک کاراکتر whitespace (معمولاً یک فاصله) بین var و age وجود داشته باشد تا کامپایلر بتواند آنها را تشخیص دهد.
از سوی دیگر، در عبارت زیر :
int fruit = apples + oranges //get the total fruits
هیچ کاراکتر فضای خالی بین fruit و =، یا بین = و apples لازم نیست، اگرچه میتوانید برای خوانایی بهتر، برخی از آنها را اضافه کنید.
فضای دو طرف operator باید برابر باشد، به عنوان مثال.
int fruit = apples +oranges //is a wrong statement
int fruit = apples + oranges //is a Correct statement
Literals
Literal نمایش سورس کد مقدار یک عدد صحیح ، عدد floating-point یا نوع رشته است.
92 // Integer literal
4.24159 // Floating-point literal
"Hello, World!" // String literal
چاپ در سوئیفت
برای چاپ سریع هر چیزی، کلمه کلیدی “Print ” را داریم.
چاپ سه ویژگی متفاوت دارد.
Items : مواردی که باید چاپ شوند.
Separator : جداکننده بین آیتم ها
Terminator : مقداری که خط باید با آن تمام شود.
بیایید یک مثال و سینتکس از آن را ببینیم.
print("Items to print", separator: "Value " , terminator: "Value")
// E.g. of print statement.
print("Value one")
// prints "Value one \n" Adds, \n as terminator and " " as separator by
default.
print("Value one","Value two", separator: " Next Value" , terminator: " End")
//prints "Value one Next Value Value two End"
انواع داده ها
هنگام انجام برنامه نویسی در هر زبان برنامه نویسی ، باید از انواع مختلفی از متغیرها برای ذخیره اطلاعات استفاده کنید.
متغیرها چیزی نیستند جز مکان های ذخیره شده حافظه برای ذخیره مقادیر.
این بدان معنی است که وقتی یک متغیر ایجاد می کنید، مقداری فضا در حافظه ذخیره می کنید.
ممکن است بخواهید اطلاعات انواع دادهای مانند رشته ، کاراکتر ، wide character ، عدد صحیح، floating point ، بولین و … را ذخیره کنید.
بر اساس نوع داده یک متغیر ، سیستم عامل حافظه را تخصیص میدهد و تصمیم میگیرد چه چیزی را میتوان در مموری ذخیره کرد.
انواع داده های داخلی
Swift 4 مجموعه ای غنی از انواع داده های داخلی و همچنین تعریف شده توسط کاربر را به برنامه نویس ارائه می دهد.
انواع داده های پایه اغلب هنگام اعلام متغیرها استفاده می شود :
Int یا UInt : برای اعداد کامل استفاده می شود.
به طور دقیق تر، می توانید از Int32، Int64 برای تعریف عدد صحیح با علامت 32 یا 64 بیتی استفاده کنید، در حالی که UInt32 یا UInt64 برای تعریف متغیرهای عدد صحیح بدون علامت 32 یا 64 بیتی استفاده کنید. به عنوان مثال ، 42 و -23.
Float : برای نمایش یک عدد ممیز شناور 32 بیتی و اعداد با اعشار کوچکتر استفاده می شود.
به عنوان مثال، 3.14159، 0.1، و -273.158.
Double : برای نمایش یک عدد ممیز شناور 64 بیتی استفاده می شود و زمانی استفاده می شود که مقادیر ممیز شناور باید بسیار بزرگ باشند.
به عنوان مثال، 3.14159، 0.1، و -273.158.
Bool : این یک مقدار بولی را نشان می دهد که درست یا نادرست است.
رشته : این مجموعه مرتب شده ای از کاراکترها است.
به عنوان مثال ، “Hello, World!”
کاراکتر : این یک رشته تک کاراکتری است. به عنوان مثال ، “C”
Optional : این نشان دهنده متغیری است که می تواند مقدار یا بدون مقدار را در خود نگه دارد.
Tuples : برای گروه بندی چندین مقدار در یک مقدار ترکیبی استفاده می شود.
ما در اینجا چند نکته مهم مربوط به انواع عدد صحیح را فهرست کرده ایم :
- در یک پلتفرم 32 بیتی، Int به اندازه Int32 است.
- در یک پلتفرم 64 بیتی، Int به اندازه Int64 است.
- در یک پلتفرم 32 بیتی، UInt به اندازه UInt32 است.
- در یک پلتفرم 64 بیتی، UInt به اندازه UInt64 است.
Int8، Int16، Int32، Int64 را می توان برای نمایش اشکال 8 بیتی، 16 بیتی، 32 بیتی و 64 بیتی از signed integer استفاده کرد.
UInt8، UInt16، UInt32، و UInt64 را می توان برای نمایش اشکال 8 بیتی، 16 بیتی، 32 بیتی و 64 بیتی اعداد صحیح بدون علامت استفاده کرد.
ارزش های محدود
جدول زیر نوع متغیر، مقدار حافظه مورد نیاز برای ذخیره value در حافظه و حداکثر و حداقل مقدار قابل ذخیره در این نوع متغیرها را نشان می دهد.
Type | Typical Bit Width | Typical Range |
---|---|---|
Int8 | 1byte | -127 to 127 |
UInt8 | 1byte | 0 to 255 |
Int32 | 4bytes | -2147483648 to 2147483647 |
UInt32 | 4bytes | 0 to 4294967295 |
Int64 | 8bytes | -9223372036854775808 to 9223372036854775807 |
UInt64 | 8bytes | 0 to 18446744073709551615 |
Float | 4bytes | 1.2E-38 to 3.4E+38 (~6 digits) |
Double | 8bytes | 2.3E-308 to 1.7E+308 (~15 digits) |
Aliases
می توانید با استفاده از typealias یک نام جدید برای یک type موجود ایجاد کنید.
در اینجا سینتکس ساده برای تعریف یک نوع جدید با استفاده از typealias ، آمده است :
typealias newname = type
به عنوان مثال، خط زیر به کامپایلر دستور می دهد که Feet نام دیگری برای Int ، است.
typealias Feet = Int
اکنون، اعلان زیر کاملاً قانونی است و یک متغیر integer به نام distance ایجاد می کند.
typealias Feet = Int
var distance: Feet = 100
print(distance)
وقتی برنامه فوق را با استفاده از playground اجرا می کنیم، نتیجه زیر را می گیریم.
100
Type Safety
Swift 4 یک زبان type-safe است.
به این معنی که اگر بخشی از کد شما انتظار یک رشته را داشته باشد، نمی توانید آن را به اشتباه یک Int ارسال کنید.
از آنجایی که سوئیفت 4 از نظر type-safe است، هنگام کامپایل کد شما، type بررسی را انجام می دهد و انواع ناهماهنگ را به عنوان خطا علامت گذاری می کند.
var varA = 42
varA = "This is hello"
print(varA)
وقتی برنامه فوق را کامپایل می کنیم، خطای زمان کامپایل زیر را ایجاد می کند.
main.swift:2:8: error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"
Type Inference
inference به یک کامپایلر امکان می دهد تا type یک particular expression (عبارت خاص) را به طور خودکار هنگام کامپایل کردن کد شما، به سادگی با بررسی مقادیری که ارائه می کنید، inference کند. سوئیفت 4 از inference استفاده می کند تا type مناسب را به شرح زیر بدست آورد.
// varA is inferred to be of type Int
var varA = 42
print(varA)
// varB is inferred to be of type Double
var varB = 3.14159
print(varB)
// varC is also inferred to be of type Double
var varC = 3 + 0.14159
print(varC)
خروجی :
42
3.14159
3.14159
متغیر ها
یک متغیر فضای ذخیره سازی نامگذاری شده ای را در اختیار ما قرار می دهد که برنامه های ما می توانند آن را دستکاری کنند.
هر متغیر در سوئیفت 4 نوع خاصی دارد که اندازه و چیدمان حافظه متغیر را تعیین می کند.
محدوده مقادیری که می توان در آن حافظه ذخیره کرد.
و مجموعه عملیاتی که می توان روی متغیر اعمال کرد.
سوئیفت 4 از انواع اصلی متغیرهای Int – Float – Double – Bool – String و Character پشتیبانی می کند که در بخش قبلی توضیحات آن داده شده است.
Swift - Optionals
سوئیفت 4 همچنین Optionals type را معرفی می کند که عدم وجود یک مقدار را کنترل می کند.
گزینه های اختیاری می گویند “یک مقدار وجود دارد و برابر با x است” یا “اصلا مقداری وجود ندارد”.
Optional به تنهایی یک type است و در واقع یکی از جدیدترین گزینه های سوئیفت 4 است.
این دارای دو مقدار ممکن است، None و Some(T)، که در آن T یک مقدار مرتبط از type داده صحیح موجود در سوئیفت 4 است.
var perhapsInt: Int?
در اینجا یک اعلان رشته اختیاری است :
var perhapsStr: String?
اعلان بالا معادل مقداردهی اولیه آن به nil است که به معنای عدم وجود مقدار است.
var perhapsStr: String? = nil
بیایید مثال زیر را در نظر بگیریم تا بفهمیم که چگونه گزینههای اختیاری در Swift 4 کار میکنند
var myString:String? = nil
if myString != nil {
print(myString)
} else {
print("myString has nil value")
}
خروجی :
myString has nil value
گزینههای اختیاری مشابه استفاده از nil با اشارهگرها در Objective-C هستند،
اما برای هر type ، نه فقط کلاسها، کار میکنند.
Forced Unwrapping
اگر متغیری را اختیاری تعریف کرده اید ، برای دریافت مقدار از این متغیر ، باید آن را باز کنید.
این فقط به معنای قرار دادن یک علامت تعجب در انتهای متغیر است.
مثال :
var myString:String?
myString = "Hello, Swift 4!"
if myString != nil {
print(myString)
} else {
print("myString has nil value")
}
خروجی :
Optional("Hello, Swift 4!")
حالا اجازه دهید unwrapping را اعمال کنیم تا مقدار صحیح متغیر را بدست آوریم
var myString:String?
myString = "Hello, Swift 4!"
if myString != nil {
print( myString! )
} else {
print("myString has nil value")
}
خروجی :
Hello, Swift 4!
Automatic Unwrapping
می توانید متغیرهای اختیاری را با استفاده از علامت تعجب به جای علامت سوال اعلام کنید.
چنین متغیرهای اختیاری به طور خودکار باز می شوند و برای دریافت مقدار اختصاص داده شده نیازی به استفاده از علامت تعجب دیگری در انتهای متغیر ندارید.
var myString:String!
myString = "Hello, Swift 4!"
if myString != nil {
print(myString)
} else {
print("myString has nil value")
}
خروجی :
Hello, Swift 4!
Optional Binding
از binding برای پیدا کردن اینکه آیا یک valueاختیاری حاوی value است یا خیر، استفاده کنید، و اگر چنین است، آن value را به عنوان یک constant یا variable موقت در دسترس قرار دهید.
یک optional binding برای دستور if به صورت زیر است :
if let constantName = someOptional {
statements
}
Tuple ها
سوئیفت 4 Tuples type را نیز معرفی می کند که برای گروه بندی چندین مقدار در یک مقدار ترکیبی واحد استفاده می شود.
مقادیر موجود در یک تاپل می توانند از هر نوع باشند و نیازی به یک نوع بودن ندارند.
به عنوان مثال، (“Tutorials Point”، 123) یک تاپل با دو مقدار است ، یکی از نوع رشته و دیگری از نوع عدد صحیح است.
شما می توانید تاپل ها را از هر مقدار که می خواهید و از هر تعداد نوع داده مختلف ایجاد کنید.
در اینجا سینتکس اعلان تاپل آمده است :
var TupleName = (Value1, value2,… any number of values)
با استفاده از اعداد شاخصی که از 0 شروع می شوند می توانید به مقادیر تاپل دسترسی پیدا کنید.
در اینجا نمونه ای از دسترسی به مقادیر tuple ، آمده است.
print(“The code is\(error501.0)”)
print(“The definition of error is\(error501.1)”)
میتوانید متغیرهای یک تاپل را در حین اعلان نامگذاری کنید و میتوانید با استفاده از نام آنها را فراخوانی کنید.
var error501 = (errorCode: 501, description: “Not Implemented”)
print(error501.errorCode) // prints 501.
تاپل ها در برگرداندن چندین مقدار از یک تابع مفید هستند.
مانند، یک برنامه وب ممکن است چندین نوع (“String”، Int) را برای نشان دادن موفقیت یا عدم موفقیت بارگیری برگرداند.
با برگرداندن مقادیر مختلف در یک تاپل ، می توانیم بسته به انواع مختلف تاپل تصمیم گیری کنیم.
نکته ی لازم به ذکر این است که تاپل ها برای مقادیر موقت مفید هستند و برای داده های پیچیده مناسب نیستند.
Constant ها
ثابت ها (Constants ) به مقادیر ثابتی اطلاق می شوند که ممکن است برنامه در طول اجرای خود تغییر ندهد.
ثابتها میتوانند از هر یک از انواع دادههای اصلی مانند ثابت عدد صحیح، ثابت floating ، ثابت کاراکتر یا یک رشته واقعی باشند ؛ همچنین ثابت های شمارش نیز وجود دارد.
ثابت ها دقیقاً مانند متغیرهای معمولی رفتار می شوند به جز این واقعیت که مقادیر آنها پس از تعریف آنها قابل تغییر نیستند.
قبل از اینکه از ثابت ها استفاده کنید، باید آنها را با استفاده از کلمه کلیدی let به صورت زیر اعلام کنید :
let constantName =
مثال :
let constA = 42
print(constA)
خروجی :
42
Literal
همانطور که گفته شد ، Literal نمایش سورس کد مقدار یک عدد صحیح ، عدد floating-point یا string type است.
42 // Integer literal
3.14159 // Floating-point literal
"Hello, world!" // String literal
Integer Literals
یک عدد صحیح می تواند یک ثابت اعشاری، باینری، اکتال یا هگزادسیمال باشد.
literal دودویی با 0b شروع می شود ، حرف اکتال با 0o و literal هگزا دسیمال با 0x و هیچ برای اعشار شروع می شود.
در اینجا چند نمونه از literal اعداد صحیح آمده است :
let decimalInteger = 17 // 17 in decimal notation
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
Floating-point Literals
یک floating-point literal دارای یک قسمت صحیح، یک نقطه اعشاری ، یک قسمت کسری و یک قسمت توان است.
شما می توانید literal های ممیز شناور را به صورت اعشاری یا هگزادسیمال نشان دهید.
حروف ممیز شناور اعشاری متشکل از دنباله ای از ارقام اعشاری است که به دنبال آن یک کسر اعشاری، یک توان اعشاری یا هر دو قرار می گیرد.
literal ممیز شناور هگزا دسیمال از یک پیشوند 0x تشکیل شده است، به دنبال آن یک کسری هگزادسیمال اختیاری و به دنبال آن یک توان هگزا دسیمال.
در اینجا چند نمونه از لفظ ممیز شناور آمده است :
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
String Literals
رشته literal دنبالهای است که با گیومههای دوتایی احاطه شدهاند ، با شکل زیر:
"characters"
حروف الفبای رشتهای نمیتوانند شامل یک نقل قول دوگانه بدون فرار (“)، یک اسلش بدون گریز (\)، یک carriage return ، یا یک line feed باشند.
کارکترهای ویژه را میتوان با استفاده از دنبالههای فرار زیر در literal رشتهای گنجاند.
Escape sequence | Meaning |
---|---|
\0 | Null Character |
\\ | \character |
\b | Backspace |
\f | Form feed |
\n | Newline |
\r | Carriage return |
\t | Horizontal tab |
\v | Vertical tab |
\’ | Single Quote |
\” | Double Quote |
\000 | Octal number of one to three digits |
\xhh… | Hexadecimal number of one or more digits |
مثال :
let stringL = "Hello\tWorld\n\nHello\'Swift 4\'"
print(stringL)
خروجی :
Hello World
Hello'Swift 4'
Operator
عملگر نمادی است که به کامپایلر می گوید دستکاری های ریاضی یا منطقی خاصی را انجام دهد.
Objective-C سرشار از عملگرهای داخلی است و انواع عملگرهای زیر را ارائه می کند.
- Arithmetic Operators
- Comparison Operators
- Logical Operators
- Bitwise Operators
- Assignment Operators
- Range Operators
- Misc Operators
Arithmetic Operators
جدول زیر تمامی عملگرهای محاسباتی پشتیبانی شده توسط زبان سوئیفت 4 را نشان می دهد.
فرض کنید متغیر A دارای 10 و متغیر B دارای 20 است، سپس :
Operator | Description | Example |
---|---|---|
+ | Adds two operands | A + B will give 30 |
− | Subtracts second operand from the first | A − B will give -10 |
* | Multiplies both operands | A * B will give 200 |
/ | Divides numerator by denominator | B / A will give 2 |
% | Modulus Operator and remainder of after an integer/float division | B % A will give 0 |
Comparison Operators
جدول زیر تمامی عملگرهای رابطه ای پشتیبانی شده توسط زبان سوئیفت 4 را نشان می دهد.
فرض کنید متغیر A دارای 10 و متغیر B دارای 20 است ، سپس :
Operator | Description | Example |
---|---|---|
== | بررسی می کند که آیا مقادیر دو عملوند برابر هستند یا خیر. اگر بله، آنگاه شرط درست می شود. | (A == B) is not true. |
!= | بررسی می کند که آیا مقادیر دو عملوند برابر هستند یا خیر. اگر مقادیر برابر نباشند ، آنگاه شرط درست می شود. | (A != B) is true. |
> | بررسی می کند که آیا مقدار عملوند چپ بیشتر از مقدار عملوند راست است یا خیر. اگر بله، آنگاه شرط درست می شود. | (A > B) is not true. |
< | بررسی می کند که آیا مقدار عملوند راست بیشتر از مقدار عملوند چپ است یا خیر. اگر بله، آنگاه شرط درست می شود. | (A < B) is true. |
>= | بررسی می کند که آیا مقدار عملوند چپ بزرگتر یا مساوی با مقدار عملوند راست است یا خیر. اگر بله، آنگاه شرط درست می شود. | (A >= B) is not true. |
<= | بررسی می کند که آیا مقدار عملوند راست بزرگتر یا مساوی با مقدار عملوند چپ است یا خیر. اگر بله، آنگاه شرط درست می شود. | (A <= B) is true. |
عملگرهای منطقی
فرض کنید متغیر A دارای ۱ و متغیر B دارای ۰ است ، سپس :
Operator | Description | Example |
---|---|---|
&& | عملگر Logical AND نامیده می شود. اگر هر دو عملوند غیر صفر باشند، شرط درست می شود. | (A && B) is false. |
|| | Logical OR Operator نامیده می شود. اگر هر یک از دو عملوند غیر صفر باشد، شرط درست می شود. | (A || B) is true. |
! | Logical NOT Operator نامیده می شود. برای معکوس کردن حالت منطقی عملوند آن استفاده کنید. اگر یک شرط درست باشد، عملگر Logical NOT آن را نادرست می کند. | !(A && B) is true. |
Bitwise Operators
عملگرهای بیتی روی بیت ها کار می کنند و عملیات بیت به بیت را انجام می دهند.
p | q | p&q | p|q | p^q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
Assume A = 60; and B = 13;
In binary format, they will be as follows:
A = 0011 1100
B = 0000 1101
-----------------
A & B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
عملگرهای بیتی پشتیبانی شده توسط زبان سوئیفت 4 در جدول زیر فهرست شده اند.
فرض کنید متغیر A دارای 60 و متغیر B دارای 13 و سپس 7- می باشد.
Operator | Description | Example |
---|---|---|
& | عملگر باینری و اگر در هر دو عملوند وجود داشته باشد، مقداری را در نتیجه کپی می کند. | (A & B) will give 12, which is 0000 1100 |
| | اگر در هر یک از عملوندها وجود داشته باشد، عملگر باینری OR مقداری را کپی می کند. | (A | B) will give 61, which is 0011 1101 |
^ | عملگر XOR باینری بیت را کپی می کند، اگر در یک عملوند تنظیم شده باشد اما در هر دو نه. | (A ^ B) will give 49, which is 0011 0001 |
~ | اپراتور مکمل Binary Ones یکپارچه است و اثر «تغییر» بیت ها را دارد. | (~A ) will give -61, which is 1100 0011 in 2’s complement form. |
<< | عملگر باینری تغییر سمت چپ. مقدار عملوند سمت چپ با تعداد بیت های مشخص شده توسط عملوند سمت راست به چپ منتقل می شود. | (A << 2 will give 240, which is 1111 0000 |
>> | عملگر باینری شیفت راست. مقدار عملوند سمت چپ با تعداد بیت های مشخص شده توسط عملوند سمت راست به سمت راست منتقل می شود. | A >> 2 will give 15, which is 0000 1111 |
Assignment Operators
Operator | Description | Example |
---|---|---|
= | عملگر انتساب ساده ، مقادیر را از عملوند سمت راست به عملوند سمت چپ اختصاص می دهد | C = A + B will assign value of A + B into C |
+= | عملگر تخصیص AND را اضافه کنید، عملوند راست را به عملوند چپ اضافه می کند و نتیجه را به عملوند چپ اختصاص می دهد. | C += A is equivalent to C = C + A |
-= | عملگر تخصیص و تفریق، عملوند راست را از عملوند چپ کم می کند و نتیجه را به عملوند چپ نسبت می دهد. | C -= A is equivalent to C = C – A |
*= | عملگر انتساب Multiply AND، عملوند راست را با عملوند چپ ضرب می کند و نتیجه را به عملوند چپ اختصاص می دهد. | C *= A is equivalent to C = C * A |
/= | عملگر انتساب Divide AND، عملوند چپ را به عملوند راست تقسیم می کند و نتیجه را به عملوند چپ اختصاص می دهد. | C /= A is equivalent to C = C / A |
%= | عملگر تخصیص مدول و مدول، با استفاده از دو عملوند مدول می گیرد و نتیجه را به عملوند چپ اختصاص می دهد. | C %= A is equivalent to C = C % A |
<<= | عملگر تغییر و انتساب چپ | C <<= 2 is same as C = C << 2 |
>>= | عملگر شیفت و انتساب سمت راست | C >>= 2 is same as C = C >> 2 |
&= | عملگر انتساب بیتی AND | C &= 2 is same as C = C & 2 |
^= | OR منحصر به فرد و عملگر انتساب بیتی | C ^= 2 is same as C = C ^ 2 |
|= | bitwise شامل OR و عملگر انتساب | C |= 2 is same as C = C | 2 |
Range Operators
Swift 4 شامل دو عملگر محدوده است که میانبرهایی برای بیان محدوده ای از مقادیر هستند.
جدول زیر این دو عملگر را توضیح می دهد.
Operator | Description | Example |
---|---|---|
Closed Range | (a…b) محدوده ای را تعریف می کند که از a تا b اجرا می شود و شامل مقادیر a و b می شود. | 1…5 gives 1, 2, 3, 4 and 5 |
Half-Open Range | (a..< b) محدوده ای را تعریف می کند که از a تا b اجرا می شود، اما b را شامل نمی شود. | 1..< 5 gives 1, 2, 3, and 4 |
One- sided Range | a… ، محدوده ای را تعریف می کند که از یک تا انتهای عناصر اجرا می شود. …a ، محدوده ای را از شروع تا a تعریف می کند. | 1… gives 1 , 2,3… end of elements …2 gives beginning… to 1,2 |
Misc Operators
Operator | Description | Example |
---|---|---|
Unary Minus | علامت یک مقدار عددی را می توان با استفاده از یک پیشوند تغییر داد | -3 or -4 |
Unary Plus | مقداری را که روی آن کار میکند، بدون هیچ تغییری برمیگرداند. | +6 gives 6 |
Ternary Conditional | وضعیت ؟ X: Y | If Condition is true ? Then value X : Otherwise value Y |
Operators Precedence
Operator precedence گروه بندی عبارات در یک عبارت را تعیین می کند.
این بر نحوه ارزیابی یک عبارت تأثیر می گذارد.
اپراتورهای خاص دارای اولویت بالاتری نسبت به سایرین هستند.
برای مثال، عملگر ضرب دارای اولویت بالاتری نسبت به عملگر جمع است.
به عنوان مثال، x = 7 + 3 * 2; در اینجا x به 13 اختصاص داده می شود نه 20 زیرا عملگر * دارای اولویت بالاتر از + است، بنابراین ابتدا در 3*2 ضرب می شود و سپس به 7 اضافه می شود.
در اینجا، عملگرهایی که بیشترین اولویت را دارند در بالای جدول و آنهایی که کمترین اولویت را دارند در پایین ظاهر می شوند.
در یک عبارت، عملگرهای اولویت بالاتر ابتدا ارزیابی خواهند شد.
Operator | Description | Example |
---|---|---|
Primary Expression Operators | () [] . expr++ expr– | left-to-right |
Unary Operators | * & + – ! ~ ++expr –expr * / % + – >> << < > <= >= == != | right-to-left |
Binary Operators | & ^ | && || | left-to-right |
Ternary Operator | ?: | right-to-left |
Assignment Operators | = += -= *= /= %= >>= <<= &=^= |= | right-to-left |
Comma | , | left-to-right |
Decision Making
Sr.No | Statement & Description |
---|---|
1 | if statement دستور if متشکل از یک عبارت بولی است که با یک یا چند عبارت همراه است. |
2 | if…else statement یک دستور if را می توان با یک دستور else اختیاری دنبال کرد که زمانی اجرا می شود که عبارت Boolean false باشد. |
3 | if…else if…else Statement یک دستور if را میتوان با یک دستور if…else اختیاری دنبال کرد، که برای آزمایش شرایط مختلف با استفاده از دستور single if…else if بسیار مفید است. |
4 | nested if statements می توانید از یکی if یا else if در داخل دیگری if یا other if استفاده کنید. |
5 | switch statement یک دستور switch اجازه می دهد تا یک متغیر برای برابری در برابر لیستی از مقادیر آزمایش شود. |
Loops
ممکن است شرایطی پیش بیاید که لازم باشد یک بلوک کد را چندین بار اجرا کنید.
به طور کلی، دستورات به صورت متوالی اجرا می شوند : اولین دستور در یک تابع ابتدا اجرا می شود ، سپس دومی و …
زبانهای برنامهنویسی ساختارهای کنترلی مختلفی را ارائه میکنند که مسیرهای اجرایی پیچیدهتری را ممکن میسازد.
یک دستور حلقه به ما امکان می دهد یک دستور یا گروهی از دستورات را چندین بار اجرا کنیم.
در زیر کلی از یک عبارت حلقه در اکثر زبان های برنامه نویسی آمده است.
Sr.No | Loop Type & Description |
---|---|
1 | for-in این حلقه مجموعه ای از دستورات را برای هر آیتم در محدوده (range) ، دنباله (range) ، مجموعه (collection) یا پیشرفت انجام می دهد. |
2 | while loop یک عبارت یا گروهی از عبارات را در حالی که یک شرط معین درست است تکرار می کند. قبل از اجرای بادی حلقه، شرایط را آزمایش می کند. |
3 | repeat…while loop مانند دستور while، با این تفاوت که شرط را در انتهای بادی حلقه آزمایش می کند. |
Loop Control Statements
Loop control statements را از دنباله عادی خود تغییر می دهد.
هنگامی که اجرا از یک محدوده خارج می شود ، تمام اشیاء خودکاری که در آن محدوده ایجاد شده اند از بین می روند.
Sr.No | Control Statement & Description |
---|---|
1 | continue statement این عبارت به یک حلقه می گوید که کاری را که انجام می دهد متوقف کند و در ابتدای تکرار بعدی از طریق حلقه دوباره شروع کند. |
2 | break statement دستور حلقه را خاتمه می دهد و اجرا را به دستور بلافاصله بعد از حلقه منتقل می کند. |
3 | fallthrough statement عبارت fallthrough رفتار سوئیفت 4 سوئیچ به سوئیچ سبک C را شبیه سازی می کند. |
Strings (رشته ها)
رشتهها در سوئیفت 4 مجموعهای مرتب از کارکترها هستند ، مانند “Hello, World!” و آنها با نوع داده String نشان داده می شوند که به نوبه خود مجموعه ای از مقادیر از نوع کاراکتر را نشان می دهد.
یک رشته ایجاد کنید
شما می توانید یک رشته را با استفاده از یک string literal یا ایجاد یک نمونه از یک کلاس String به صورت زیر ایجاد کنید :
// String creation using String literal
var stringA = "Hello, Swift 4!"
print( stringA )
// String creation using String instance
var stringB = String("Hello, Swift 4!")
print( stringB )
//Multiple line string
let stringC = """
Hey this is a
example of multiple Line
string by tutorialsPoint
"""
print(stringC)
هنگامی که کد بالا کامپایل و اجرا می شود ، نتیجه زیر را ایجاد می کند.
Hello, Swift 4!
Hello, Swift 4!
Hey this is a
example of multiple Line
string by tutorialsPoint
رشته خالی
میتوانید با استفاده از یک رشته خالی یا ایجاد نمونهای از کلاس String مانند شکل زیر، یک رشته خالی ایجاد کنید.
همچنین میتوانید با استفاده از ویژگی Boolean isEmpty، خالی بودن یا نبودن یک رشته را بررسی کنید.
// Empty string creation using String literal
var stringA = ""
if stringA.isEmpty {
print( "stringA is empty" )
} else {
print( "stringA is not empty" )
}
// Empty string creation using String instance
let stringB = String()
if stringB.isEmpty {
print( "stringB is empty" )
} else {
print( "stringB is not empty" )
}
هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند :
stringA is empty
stringB is empty
ثابت های رشته ای (String Constants)
میتوانید مشخص کنید که آیا رشته شما میتواند با اختصاص دادن آن به یک متغیر تغییر (یا جهش) پیدا کند یا با تخصیص آن به یک ثابت با استفاده از کلمه کلیدی let همانطور که در زیر نشان داده شده است، ثابت خواهد بود.
// stringA can be modified
var stringA = "Hello, Swift 4!"
stringA + = "--Readers--"
print( stringA )
// stringB can not be modified
let stringB = String("Hello, Swift 4!")
stringB + = "--Readers--"
print( stringB )
هنگامی که کد بالا کامپایل و اجرا می شود ، نتیجه زیر را ایجاد می کند :
Playground execution failed: error: :10:1: error: 'String' is not
convertible to '@lvalue UInt8'
stringB + = "--Readers--"
String Interpolation
String interpolation روشی برای ساخت یک مقدار رشته جدید از ترکیبی از ثابت ها، متغیرها، literal ها و عبارات با گنجاندن مقادیر آنها در داخل یک رشته literal است.
هر آیتم (متغیر یا ثابت) که در رشته literal وارد میکنید در یک جفت پرانتز قرار میگیرد که با پیشوند یک اسلش به آن اضافه میشود.
در اینجا یک مثال ساده است :
var varA = 20
let constA = 100
var varC:Float = 20.0
var stringA = "\(varA) times \(constA) is equal to \(varC * 100)"
print( stringA )
هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند.
20 times 100 is equal to 2000.0
String Concatenation
می توانید از عملگر + برای به هم پیوستن دو رشته یا یک رشته و یک کاراکتر یا دو کاراکتر استفاده کنید.
در اینجا یک مثال ساده است.
let constA = "Hello,"
let constB = "World!"
var stringA = constA + constB
print( stringA )
طول رشته (String Length)
رشته های Swift 4 خاصیت length ندارند، اما می توانید از تابع count() global برای شمارش تعداد کاراکترهای یک رشته استفاده کنید.
در اینجا یک مثال ساده است :
var varA = "Hello, Swift 4!"
print( "\(varA), length is \((varA.count))" )
خروجی
Hello, Swift 4!, length is 15
مقایسه رشته ها
می توانید از عملگر == برای مقایسه دو متغیر رشته یا ثابت استفاده کنید.
var varA = "Hello, Swift 4!"
var varB = "Hello, World!"
if varA == varB {
print( "\(varA) and \(varB) are equal" )
} else {
print( "\(varA) and \(varB) are not equal" )
}
خروجی
Hello, Swift 4! and Hello, World! are not equal
رشته های Unicode
همانطور که در مثال زیر نشان داده شده است، می توانید به یک نمایش UTF-8 و UTF-16 از یک رشته با تکرار روی خصوصیات utf8 و utf16 آن دسترسی پیدا کنید.
var unicodeString = "Dog???"
print("UTF-8 Codes: ")
for code in unicodeString.utf8 {
print("\(code) ")
}
print("\n")
print("UTF-16 Codes: ")
for code in unicodeString.utf16 {
print("\(code) ")
}
خروجی
UTF-8 Codes:
68
111
103
63
63
63
UTF-16 Codes:
68
111
103
63
63
63
توابع و عملگرهای رشته
سوئیفت ۴ طیف گسترده ای از روش ها و عملگرهای مرتبط با رشته ها را پشتیبانی می کند.
Sr.No | Functions/Operators & Purpose |
---|---|
1 | isEmpty یک مقدار بولی که مشخص می کند آیا یک رشته خالی است یا نه. |
2 | hasPrefix(prefix: String) تابعی برای بررسی اینکه آیا یک رشته پارامتر معین به عنوان پیشوند رشته وجود دارد یا خیر. |
3 | hasSuffix(suffix: String) تابعی برای بررسی اینکه آیا یک رشته پارامتر داده شده به عنوان پسوند رشته وجود دارد یا خیر. |
4 | ()toInt تابع تبدیل مقدار رشته عددی به عدد صحیح. |
5 | ()count تابع سراسری برای شمارش تعداد کاراکترها در یک رشته. |
6 | utf8 ویژگی برای برگرداندن نمایش UTF-8 از یک رشته. |
7 | utf16 ویژگی برای برگرداندن نمایش UTF-16 از یک رشته. |
8 | unicodeScalars ویژگی برای برگرداندن نمایش اسکالر یونیکد از یک رشته. |
9 | + عملگر برای به هم پیوستن دو رشته یا یک رشته و یک کاراکتر یا دو کاراکتر. |
10 | += عملگر برای الحاق یک رشته یا کاراکتر به یک رشته موجود. |
11 | == عملگر برای تعیین برابری دو رشته. |
12 | < عملگر برای انجام یک مقایسه واژگانی برای تعیین اینکه آیا یک رشته کمتر از رشته دیگر ارزیابی می شود. |
13 | startIndex برای به دست آوردن مقدار در فهرست شروع رشته. |
14 | endIndex برای به دست آوردن مقدار در فهرست پایانی رشته. |
15 | Indices برای دسترسی به شاخص ها یک به یک. |
16 | insert(“Value”, at: position) برای درج یک مقدار در یک موقعیت. |
17 | remove(at: position) removeSubrange(range) برای حذف یک مقدار در یک موقعیت، یا حذف محدوده ای از مقادیر از رشته. |
18 | ()reversed معکوس یک رشته را برمی گرداند. |
کارکترها
یک کاراکتر در Swift یک کاراکتر String Literal است که با نوع داده Character نشان داده می شود.
به مثال زیر دقت کنید.
از دو ثابت کاراکتر ، استفاده می کند
let char1: Character = "A"
let char2: Character = "B"
print("Value of char1 \(char1)")
print("Value of char2 \(char2)")
خروجی :
Value of char1 A
Value of char2 B
اگر سعی کنید بیش از یک کاراکتر را در یک متغیر یا ثابت Character type ذخیره کنید ، Swift 4 این اجازه را نخواهد داد.
سعی کنید مثال زیر را در Swift 4 Playground تایپ کنید ، خواهید دید که حتی قبل کامپایل با خطا مواجه می شوید.
// Following is wrong in Swift 4
let char: Character = "AB"
print("Value of char \(char)")
متغیرهای کاراکتر خالی
امکان ایجاد متغیر یا ثابت Character خالی که دارای مقدار خالی باشد، وجود ندارد.
سینتکس زیر امکان پذیر نیست :
// Following is wrong in Swift 4
let char1: Character = ""
var char2: Character = ""
print("Value of char1 \(char1)")
print("Value of char2 \(char2)")
دسترسی به کاراکترها از رشته ها
همانطور که در هنگام بحث در مورد رشته های سوئیفت ۴ توضیح داده شد، String مجموعه ای از مقادیر کاراکتر را به ترتیب مشخص نشان می دهد.
بنابراین ما می توانیم با تکرار روی آن رشته با یک حلقه for-in به کاراکترهای جداگانه از رشته داده شده دسترسی پیدا کنیم.
for ch in "Hello" {
print(ch)
}
خروجی :
H
e
l
l
o
الحاق رشته ها با کاراکترها
مثال زیر نشان می دهد که چگونه یک کاراکتر سوئیفت 4 را می توان با رشته سوئیفت 4 الحاق کرد.
var varA:String = "Hello "
let varB:Character = "G"
varA.append( varB )
print("Value of varC = \(varA)")
هنگامی که کد بالا کامپایل و اجرا می شود ، نتیجه زیر را ایجاد می کند :
Value of varC = Hello G
آرایه ها
آرایه های Swift 4 برای ذخیره لیست های مرتب شده از مقادیر یکسان استفاده می شود.
سوئیفت 4 بررسی دقیقی را انجام می دهد که به شما اجازه نمی دهد تایپ اشتباهی را در یک آرایه وارد کنید ، حتی به اشتباه.
اگر یک آرایه ایجاد شده را به یک متغیر اختصاص دهید ، آنگاه همیشه قابل تغییر است ، به این معنی که می توانید آن را با افزودن، حذف یا تغییر آیتم های آن تغییر دهید.
اما اگر یک آرایه را به یک ثابت اختصاص دهید ، آن آرایه تغییرناپذیر است و اندازه و محتوای آن قابل تغییر نیست.
ایجاد آرایه ها
شما می توانید یک آرایه خالی از نوع خاصی را با استفاده از دستور initializer زیر ایجاد کنید
var someArray = [SomeType]()
در اینجا سینتکسی برای ایجاد یک آرایه با اندازه معین a* و مقداردهی اولیه آن با value ، است.
var someArray = [SomeType](count: NumbeOfElements, repeatedValue: InitialValue)
می توانید از دستور زیر برای ایجاد یک آرایه خالی از نوع Int با ۳ عنصر و مقدار اولیه صفر استفاده کنید.
var someInts = [Int](count: 3, repeatedValue: 0)
در زیر یک مثال دیگر برای ایجاد یک آرایه از سه عنصر و اختصاص سه مقدار به آن آرایه ، آورده شده است.
var someInts:[Int] = [10, 20, 30]
دسترسی به آرایه ها
میتوانید با استفاده از سینتکس subscript ، مقداری را از یک آرایه بازیابی کنید ، ایندکس مقداری را که میخواهید بازیابی کنید بلافاصله پس از نام آرایه به صورت زیر ارسال کنید.
var someVar = someArray[index]
در اینجا، شاخص از 0 شروع می شود، به این معنی که المان اول با استفاده از شاخص به عنوان 0 قابل دسترسی است ، المان دوم با استفاده از شاخص به عنوان 1 و … قابل دسترسی است.
مثال زیر نحوه ایجاد، مقداردهی اولیه و دسترسی به آرایه ها را نشان می دهد :
var someInts = [Int](count: 3, repeatedValue: 10)
var someVar = someInts[0]
print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "Value of third element is \(someInts[2])" )
خروجی :
Value of first element is 10
Value of second element is 10
Value of third element is 10
اصلاح آرایه ها
می توانید از متد () append یا عملگر تخصیص جمع (+=) برای اضافه کردن یک آیتم جدید در انتهای یک آرایه استفاده کنید.
به مثال زیر دقت کنید.
در اینجا، ابتدا یک آرایه خالی ایجاد می کنیم و سپس عناصر جدید را به همان آرایه اضافه می کنیم
var someInts = [Int]()
someInts.append(20)
someInts.append(30)
someInts += [40]
var someVar = someInts[0]
print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "Value of third element is \(someInts[2])" )
خروجی :
Value of first element is 20
Value of second element is 30
Value of third element is 40
همانطور که در مثال زیر نشان داده شده است، می توانید یک عنصر موجود از یک آرایه را با اختصاص یک مقدار جدید در یک شاخص داده شده تغییر دهید :
var someInts = [Int]()
someInts.append(20)
someInts.append(30)
someInts += [40]
// Modify last element
someInts[2] = 50
var someVar = someInts[0]
print( "Value of first element is \(someVar)" )
print( "Value of second element is \(someInts[1])" )
print( "Value of third element is \(someInts[2])" )
خروجی :
Value of first element is 20
Value of second element is 30
Value of third element is 50
تکرار روی یک آرایه
همانطور که در مثال زیر نشان داده شده است، می توانید از حلقه for-in برای تکرار کل مجموعه مقادیر در یک آرایه استفاده کنید.
var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs += ["Google"]
for item in someStrs {
print(item)
}
خروجی :
Apple
Amazon
Google
میتوانید از تابع () enumerate استفاده کنید که نمایه یک آیتم را به همراه مقدار آن برمیگرداند، همانطور که در مثال زیر نشان داده شده است.
var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs += ["Google"]
for (index, item) in someStrs.enumerated() {
print("Value at index = \(index) is \(item)")
}
خروجی :
Value at index = 0 is Apple
Value at index = 1 is Amazon
Value at index = 2 is Google
اضافه کردن دو آرایه
شما می توانید از عملگر جمع (+) برای اضافه کردن دو آرایه از یک نوع استفاده کنید که یک آرایه جدید با ترکیبی از مقادیر از دو آرایه به صورت زیر به دست می آید :
var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = intsA + intsB
for item in intsC {
print(item)
}
خروجی :
2
2
1
1
1
تعداد Property ها :
می توانید از خاصیت read-only count یک آرایه برای یافتن تعداد آیتم های آرایه نشان داده شده در زیر استفاده کنید :
var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = intsA + intsB
print("Total items in intsA = \(intsA.count)")
print("Total items in intsB = \(intsB.count)")
print("Total items in intsC = \(intsC.count)")
خروجی :
Total items in intsA = 2
Total items in intsB = 3
Total items in intsC = 5
empty Property
میتوانید از ویژگی خالی فقط خواندنی یک آرایه برای یافتن خالی بودن یا نبودن یک آرایه مانند شکل زیر استفاده کنید.
var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = [Int]()
print("intsA.isEmpty = \(intsA.isEmpty)")
print("intsB.isEmpty = \(intsB.isEmpty)")
print("intsC.isEmpty = \(intsC.isEmpty)")
خروجی :
intsA.isEmpty = false
intsB.isEmpty = false
intsC.isEmpty = true
مجموعه ها
مجموعههای Swift 4 برای ذخیره مقادیر متمایز از انواع مشابه استفاده میشوند ، اما مانند آرایهها ترتیب مشخصی ندارند.
اگر ترتیب عناصر مشکلی نیست ، یا اگر می خواهید مطمئن شوید که مقادیر تکراری وجود ندارد ، می توانید از مجموعه ها (sets) به جای آرایه ها استفاده کنید.
(مجموعه ها فقط مقادیر متمایز را مجاز می کنند.)
یک نوع باید قابل هش باشد تا در یک مجموعه ذخیره شود.
مقدار هش یک مقدار Int است که برای اشیاء مساوی برابر است.
برای مثال، اگر x == y ، آنگاه x.hashvalue == y.hashvalue.
همه مقادیر اولیه swift به طور پیش فرض از نوع هش پذیر هستند و ممکن است به عنوان values تنظیم و استفاده شوند.
ایجاد مجموعه ها :
شما می توانید یک مجموعه خالی از نوع خاصی را با استفاده از دستور initializer زیر ایجاد کنید
var someSet = Set() //Character can be replaced by data type of set.
دسترسی و اصلاح مجموعه ها
میتوانید با استفاده از متدها و ویژگیهای آن به یک مجموعه دسترسی داشته باشید یا آن را تغییر دهید.
برای نشان دادن تعداد عناصر در مجموعه می توان از متد “count” استفاده کرد.
someSet.count // prints the number of elements
از روش “insert” می توان برای درج مقادیر در مجموعه استفاده کرد.
someSet.insert("c") // adds the element to Set.
به طور مشابه ، isEmpty را می توان برای بررسی خالی بودن مجموعه استفاده کرد.
someSet.isEmpty // returns true or false depending on the set Elements.
برای حذف value در مجموعه می توان از متد “remove” استفاده کرد.
someSet.remove("c") // removes a element , removeAll() can be used to remove all elements
از متد “contains” می توان برای بررسی وجود مقدار در یک مجموعه استفاده کرد.
someSet.contains("c") // to check if set contains this value.
تکرار بیش از یک مجموعه
می توانید با استفاده از حلقه for-in – روی یک مجموعه تکرار کنید :
for items in someSet {
print(someSet)
}
//Swift sets are not in an ordered way, to iterate over a set in ordered way use
for items in someSet.sorted() {
print(someSet)
}
انجام عملیات مجموعه
شما می توانید عملیات مجموعه اولیه را در Swift Sets انجام دهید.
در زیر متد هایی برای انجام عملیات مجموعه آمده است :
- Intersection
- Union
- subtracting
let evens: Set = [10,12,14,16,18]
let odds: Set = [5,7,9,11,13]
let primes = [2,3,5,7]
odds.union(evens).sorted()
// [5,7,9,10,11,12,13,14,16,18]
odds.intersection(evens).sorted()
//[]
odds.subtracting(primes).sorted()
//[9, 11, 13]
Dictionaries
dictionarie های Swift 4 برای ذخیره لیست های نامرتب مقادیر از یک نوع استفاده می شود.
Swift 4 بررسی دقیقی را انجام می دهد که به شما اجازه نمی دهد حتی به اشتباه یک نوع اشتباه را در dictionarie وارد کنید.
dictionarie های Swift 4 از شناسه منحصر به فردی که به عنوان کلید شناخته می شود برای ذخیره مقداری استفاده می کنند که بعداً می توان به آن ارجاع داد و از طریق همان کلید جستجو کرد.
برخلاف موارد موجود در یک آرایه ، موارد موجود در dictionarie دارای ترتیب مشخصی نیستند.
زمانی که باید مقادیر را بر اساس شناسه آنها جستجو کنید ، می توانید از dictionarie استفاده کنید.
یک کلید dictionarie می تواند یک عدد صحیح یا یک رشته بدون محدودیت باشد ، اما باید در یک dictionarie منحصر به فرد باشد.
اگر یک dictionarie ایجاد شده را به یک متغیر اختصاص دهید ، همیشه قابل تغییر است ، به این معنی که می توانید آن را با افزودن ، حذف یا تغییر موارد آن تغییر دهید.
اما اگر dictionarie را به یک ثابت اختصاص دهید ، آن dictionarie تغییرناپذیر است و اندازه و محتوای آن قابل تغییر نیست.
ایجاد Dictionary
شما می توانید یک dictionarie از نوع خاصی را با استفاده از دستور initializer زیر ایجاد کنید :
var someDict = [KeyType: ValueType]()
میتوانید از سینتکس ساده زیر برای ایجاد یک dictionarie استفاده کنید که کلید آن از نوع Int و مقادیر مرتبط رشتهها خواهد بود.
var someDict = [Int: String]()
در اینجا یک مثال برای ایجاد یک dictionary از مجموعه ای از مقادیر داده شده است.
var someDict = [Int: String]()
در اینجا یک مثال برای ایجاد یک دیکشنری از مجموعه ای از مقادیر داده شده است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
مقدار دهی اولیه بر اساس Initialization
سوئیفت 4 به شما امکان می دهد از آرایه ها دیکشنری ایجاد کنید (Key-Value Pairs).
var cities = [“Delhi”,”Bangalore”,”Hyderabad”]
میتوانید از سینتکس ساده زیر برای ایجاد یک dictionary استفاده کنید که کلید آن از نوع Int و مقادیر مرتبط رشتهها خواهد بود.
var Distance = [2000,10, 620]
خروجی :
let cityDistanceDict = Dictionary(uniqueKeysWithValues: zip(cities, Distance))
خطوط کد بالا یک dictionary با Cities به عنوان کلید و Distance به عنوان Value ، ایجاد می کند.
فیلتر کردن
سوئیفت 4 به شما امکان می دهد مقادیر را از یک dictionary فیلتر کنید.
var closeCities = cityDistanceDict.filter { $0.value < 1000 }
اگر کد بالا را اجرا کنیم، دیکشنری closeCities ما خواهد بود.
["Bangalore" : 10 , "Hyderabad" : 620]
گروه بندی Dictionary
سوئیفت 4 به شما امکان می دهد تا مقادیر دیکشنری را گروه بندی کنید.
var cities = ["Delhi","Bangalore","Hyderabad","Dehradun","Bihar"]
می توانید از سینتکس ساده زیر برای گروه بندی مقادیر dictionary بر اساس الفبای اول استفاده کنید.
var GroupedCities = Dictionary(grouping: cities ) { $0.first! }
خروجی :
["D" :["Delhi","Dehradun"], "B" : ["Bengaluru","Bihar"], "H" : ["Hyderabad"]]
دسترسی به Dictionaries
میتوانید با استفاده از سینتکس subscript ، یک مقدار را از یک dictionary بازیابی کنید، و کلید مقداری را که میخواهید بازیابی کنید، بلافاصله پس از نام dictionary به صورت زیر وارد کنید.
var someVar = someDict[key]
بیایید مثال زیر را برای ایجاد ، مقداردهی اولیه و دسترسی به مقادیر از یک dictionary بررسی کنیم.
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someVar = someDict[1]
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )
هنگامی که کد بالا کامپایل و اجرا می شود ، نتیجه زیر را ایجاد می کند .
Value of key = 1 is Optional("One")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")
اصلاح Dictionaries
میتوانید از متد updateValue(forKey:) برای اضافه کردن یک مقدار موجود به یک کلید معین از dictionary استفاده کنید.
این متد یک مقدار اختیاری از نوع مقدار dictionary را برمی گرداند.
در اینجا یک مثال ساده است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict.updateValue("New value of one", forKey: 1)
var someVar = someDict[1]
print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )
خروجی :
Old value of key = 1 is Optional("One")
Value of key = 1 is Optional("New value of one")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")
همانطور که در مثال زیر نشان داده شده است ، می توانید یک عنصر موجود از یک dictionary را با تخصیص مقدار جدید به یک کلید مشخص تغییر دهید :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict[1]
someDict[1] = "New value of one"
var someVar = someDict[1]
print( "Old value of key = 1 is \(oldVal)" )
print( "Value of key = 1 is \(someVar)" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )
خروجی :
Old value of key = 1 is Optional("One")
Value of key = 1 is Optional("New value of one")
Value of key = 2 is Optional("Two")
Value of key = 3 is Optional("Three")
جفت های Key-Value را حذف کنید
می توانید از متد () removeValueForKey برای حذف یک جفت Key-Value از دیکشنری استفاده کنید.
این روش جفت Key-Value را در صورت وجود حذف میکند و مقدار حذف شده را برمیگرداند، یا اگر مقداری وجود نداشته باشد، صفر را برمیگرداند.
در اینجا یک مثال ساده است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var removedValue = someDict.removeValue(forKey: 2)
print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )
خروجی :
Value of key = 1 is Optional("One")
Value of key = 2 is nil
Value of key = 3 is Optional("Three")
همچنین میتوانید از دستور subscript برای حذف یک جفت key-value از dictionary با اختصاص مقدار صفر برای آن کلید استفاده کنید.
در اینجا یک مثال ساده است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
someDict[2] = nil
print( "Value of key = 1 is \(someDict[1])" )
print( "Value of key = 2 is \(someDict[2])" )
print( "Value of key = 3 is \(someDict[3])" )
خروجی :
Value of key = 1 is Optional("One")
Value of key = 2 is nil
Value of key = 3 is Optional("Three")
تکرار بیش از یک Dictionary
همانطور که در مثال زیر نشان داده شده است ، می توانید از یک حلقه for-in برای تکرار روی کل مجموعه جفت های key-value در یک دیکشنری استفاده کنید.
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
for (index, keyValue) in someDict.enumerated() {
print("Dictionary key \(index) - Dictionary value \(keyValue)")
}
خروجی :
Dictionary key 2 - Dictionary value Two
Dictionary key 3 - Dictionary value Three
Dictionary key 1 - Dictionary value One
میتوانید از تابع ()enumerate استفاده کنید که نمایه مورد را به همراه جفت (key, value) آن برمیگرداند، همانطور که در مثال زیر نشان داده شده است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
for (key, value) in someDict.enumerated() {
print("Dictionary key \(key) - Dictionary value \(value)")
}
خروجی :
Dictionary key 0 - Dictionary value (key: 2, value: "Two")
Dictionary key 1 - Dictionary value (key: 3, value: "Three")
Dictionary key 2 - Dictionary value (key: 1, value: "One")
تبدیل به آرایه
میتوانید فهرستی از جفتهای key-value را از یک dictionary استخراج کنید تا آرایههای مجزا برای کلیدها و مقادیر بسازید.
در اینجا یک مثال است :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
let dictKeys = [Int](someDict.keys)
let dictValues = [String](someDict.values)
print("Print Dictionary Keys")
for (key) in dictKeys {
print("\(key)")
}
print("Print Dictionary Values")
for (value) in dictValues {
print("\(value)")
}
خروجی :
Print Dictionary Keys
2
3
1
Print Dictionary Values
Two
Three
One
تعداد Property
میتوانید از خاصیت شمارش read-only یک dictionary برای یافتن تعداد آیتمهای یک dictionary مانند شکل زیر استفاده کنید.
var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]
print("Total items in someDict1 = \(someDict1.count)")
print("Total items in someDict2 = \(someDict2.count)")
خروجی :
Total items in someDict1 = 3
Total items in someDict2 = 2
empty Property
همانطور که در زیر نشان داده شده است می توانید از ویژگی empty فقط خواندنی یک dictionary برای یافتن خالی بودن یا نبودن دیکشنری استفاده کنید.
var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]
var someDict3:[Int:String] = [Int:String]()
print("someDict1 = \(someDict1.isEmpty)")
print("someDict2 = \(someDict2.isEmpty)")
print("someDict3 = \(someDict3.isEmpty)")
خروجی :
someDict1 = false
someDict2 = false
someDict3 = true
توابع
تابع مجموعه ای از عبارات است که با هم برای انجام یک کار خاص سازماندهی شده اند.
یک تابع Swift 4 می تواند به اندازه یک تابع ساده C تا پیچیده مانند یک تابع زبان Objective C باشد.
به ما اجازه می دهد تا مقادیر پارامترهای global و سراسری را در فراخوانی تابع ارسال کنیم.
Function Declaration : نام، نوع بازگشت و پارامترهای تابع را به کامپایلر میگوید.
Function Definition : بادی واقعی تابع را ارائه می دهد.
توابع سوئیفت 4 شامل نوع پارامتر و انواع برگشتی آن هستند.
Function Definition
در سوئیفت 4 ، یک تابع با کلمه کلیدی “func” تعریف می شود.
هنگامی که یک تابع به تازگی تعریف شده است ، ممکن است یک یا چند مقدار را به عنوان “پارامترهای” ورودی به تابع بگیرد و توابع را در بادی اصلی پردازش کرده و مقادیر را به عنوان خروجی “انواع بازگشتی” به توابع پس دهد.
هر تابع یک نام تابع دارد که وظیفه ای را که تابع انجام می دهد را توصیف می کند.
برای استفاده از یک تابع، آن تابع را با نام آن فراخوانی میکنید و مقادیر ورودی (که به عنوان آرگومان شناخته میشوند) را ارسال میکنید که با انواع پارامترهای تابع مطابقت دارد.
پارامترهای تابع نیز به عنوان “Tuples” نامیده می شوند.
آرگومان های یک تابع باید همیشه به همان ترتیب لیست پارامترهای تابع ارائه شوند و مقادیر برگشتی با → دنبال شوند.
func funcname(Parameters) -> returntype {
Statement1
Statement2
---
Statement N
return parameters
}
به کد زیر دقت کنید ، نام دانشآموز بهعنوان نوع داده رشتهای اعلام شده در تابع ‘student’ اعلام میشود و زمانی که تابع فراخوانی شد، نام دانشآموز را برمیگرداند.
func student(name: String) -> String {
return name
}
print(student(name: "First Program"))
print(student(name: "About Functions"))
خروجی :
First Program
About Functions
فراخوانی یک تابع
فرض کنید تابعی به نام «display» تعریف کردهایم، مثلاً برای نمایش اعداد، یک تابع با نام «display» ابتدا با آرگومان «no1» که نوع داده اعداد صحیح را در خود نگه میدارد، مقداردهی میشود.
سپس آرگومان ‘no1’ به آرگومان ‘a’ اختصاص داده می شود که از این به بعد به همان نوع داده عدد صحیح اشاره خواهد کرد.
حالا آرگومان ‘a’ به تابع برگردانده می شود.
در اینجا تابع () display مقدار صحیح را نگه میدارد و هر بار که تابع فراخوانی میشود مقادیر صحیح را برمیگرداند.
func display(no1: Int) -> Int {
let a = no1
return a
}
print(display(no1: 100))
print(display(no1: 200))
خروجی :
100
200
پارامترها و مقادیر بازگشتی
سوئیفت 4 پارامترهای تابع انعطاف پذیر و مقادیر بازگشتی آن را از مقادیر ساده به پیچیده ارائه می دهد.
مشابه با C و Objective C، توابع در سوئیفت 4 نیز ممکن است اشکال مختلفی داشته باشند.
توابع با پارامترها
یک تابع با ارسال مقادیر پارامتر آن به بدنه تابع قابل دسترسی است.
میتوانیم مقادیر پارامترهای منفرد به چندگانه را به صورت چند تایی در داخل تابع ارسال کنیم.
func mult(no1: Int, no2: Int) -> Int {
return no1*no2
}
print(mult(no1: 2, no2: 20))
print(mult(no1: 3, no2: 15))
print(mult(no1: 4, no2: 30))
خروجی :
40
45
120
توابع بدون پارامتر
همچنین ممکن است توابعی بدون هیچ پارامتری داشته باشیم.
func funcname() -> datatype {
return datatype
}
مثال :
func votersname() -> String {
return "Alice"
}
print(votersname())
خروجی :
Alice
توابع با مقادیر بازگشتی
همچنین از توابع برای برگرداندن مقادیر رشته ، عدد صحیح و float به عنوان انواع داده استفاده می شود.
برای پیدا کردن بزرگترین و کوچکترین عدد در یک آرایه داده شده تابع ‘ls’ با انواع داده های عدد صحیح بزرگ و کوچک اعلام می شود.
یک آرایه برای نگهداری مقادیر صحیح مقداردهی اولیه می شود.
سپس آرایه پردازش می شود و هر مقدار در آرایه خوانده می شود و با مقدار قبلی خود مقایسه می شود.
زمانی که مقدار کمتر از مقدار قبلی باشد، در آرگومان کوچک ذخیره می شود ، در غیر این صورت در آرگومان بزرگ ذخیره می شود و با فراخوانی تابع، مقادیر برگردانده می شوند.
func ls(array: [Int]) -> (large: Int, small: Int) {
var lar = array[0]
var sma = array[0]
for i in array[1.. lar {
lar = i
}
}
return (lar, sma)
}
let num = ls(array: [40,12,-5,78,98])
print("Largest number is: \(num.large) and smallest number is: \(num.small)")
خروجی :
Largest number is: 98 and smallest number is: -5
توابع بدون مقادیر بازگشتی
برخی از توابع ممکن است آرگومان هایی در داخل تابع بدون هیچ مقدار بازگشتی اعلام شده داشته باشند.
برنامه زیر a و b را به عنوان آرگومان های تابع ()sum اعلام می کند.
در داخل خود تابع، مقادیر آرگومانهای a و b با فراخوانی تابع ()sum ارسال میشوند و مقادیر آن چاپ میشوند و بدین ترتیب مقادیر بازگشتی حذف میشوند.
func sum(a: Int, b: Int) {
let a = a + b
let b = a - b
print(a, b)
}
sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)
خروجی :
30 20
50 40
30 24
توابع با پارامترهای Local در مقابل External
نام تجاری محلی
نامهای محلی به تنهایی در داخل تابع قابل دسترسی است.
func sample(number: Int) {
print(number)
}
در اینجا، شماره آرگومان نمونه تابعی به عنوان متغیر داخلی اعلام میشود ، زیرا به صورت داخلی توسط تابع ()sample قابل دسترسی است.
در اینجا ‘number’ به عنوان متغیر لوکال اعلام می شود اما ارجاع به متغیر خارج از تابع با عبارت زیر انجام می شود.
func sample(number: Int) {
print(number)
}
sample(number: 1)
sample(number: 2)
sample(number: 3)
خروجی :
1
2
3
نام پارامترهای خارجی
نام پارامترهای خارجی به ما اجازه می دهد تا پارامترهای تابع را نامگذاری کنیم تا هدف آنها واضح تر شود.
به عنوان مثال در زیر می توانید دو پارامتر تابع را نام ببرید و سپس آن تابع را به صورت زیر فراخوانی کنید.
func pow(firstArg a: Int, secondArg b: Int) -> Int {
var res = a
for _ in 1..
خروجی :
125
خروجی :
Value of key = 1 is Optional("One")
Value of key = 2 is nil
Value of key = 3 is Optional("Three")
پارامترهای متغیر
وقتی میخواهیم تابع را با چندین آرگومان تعریف کنیم، میتوانیم اعضا را بهعنوان پارامترهای «variadic» تعریف کنیم.
پارامترها را می توان با (···) بعد از نام پارامتر به عنوان متغیر مشخص کرد.
func vari(members: N...){
for i in members {
print(i)
}
}
vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Swift 4", "Enumerations", "Closures")
خروجی :
4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures
پارامترهای ثابت، متغیر و ورودی/خروجی
توابع بهطور پیشفرض ، پارامترها را «ثابت» در نظر میگیرند، در حالی که کاربر میتواند آرگومانهای توابع را بهعنوان متغیر نیز اعلام کند.
قبلاً بحث کردیم که کلمه کلیدی “let” برای اعلام پارامترهای ثابت استفاده می شود و پارامترهای متغیر با کلمه کلیدی “var” تعریف می شوند.
پارامترهای ورودی/خروجی در سوئیفت 4 عملکردی را برای حفظ مقادیر پارامتر فراهم میکنند، حتی اگر مقادیر آن پس از فراخوانی تابع تغییر کند.
در ابتدای تعریف پارامتر تابع، کلمه کلیدی “inout” برای حفظ مقادیر اعضا اعلام می شود.
این کلمه کلیدی “inout” را مشتق می کند زیرا مقادیر آن “in” به تابع ارسال می شود و مقادیر آن توسط بدنه تابع آن دسترسی و اصلاح می شود و برای تغییر آرگومان اصلی “out” از تابع برمی گردد.
متغیرها فقط به عنوان آرگومان برای پارامتر in-out ارسال می شوند زیرا مقادیر آن به تنهایی در داخل و خارج تابع تغییر می کند.
بنابراین نیازی به اعلام رشته ها و literals به عنوان پارامترهای ورودی نیست.
‘&’ قبل از نام متغیر به این اشاره دارد که ما آرگومان را به پارامتر in-out ارسال می کنیم.
func temp(a1: inout Int, b1: inout Int) {
let t = a1
a1 = b1
b1 = t
}
var no = 2
var co = 10
temp(a1: &no, b1: &co)
print("Swapped values are \(no), \(co)")
خروجی :
Swapped values are 10, 2
انواع عملکرد و کاربرد آن
هر تابع با در نظر گرفتن پارامترهای ورودی تابع خاصی را دنبال می کند و نتیجه دلخواه را به دست می آورد.
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
مثال
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))
خروجی :
2
6
در اینجا تابع با دو آرگومان no1 و no2 به عنوان انواع داده های عدد صحیح مقداردهی اولیه می شود و نوع برگشتی آن نیز به عنوان ‘int’ اعلام می شود.
Func inputstr(name: String) -> String {
return name
}
در اینجا تابع به عنوان نوع داده رشته ای اعلام می شود.
توابع همچنین ممکن است دارای انواع داده های باطل باشند و چنین توابعی چیزی را بر نمی گرداند.
func inputstr() {
print("Swift 4 Functions")
print("Types and its Usage")
}
inputstr()
خروجی :
Swift 4 Functions
Types and its Usage
انواع تابع به عنوان انواع پارامتر و انواع بازگشت
همچنین میتوانیم خود تابع را بهعنوان انواع پارامتر به تابع دیگری منتقل کنیم.
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
print("Result: \(addition(a, b))")
}
another(sum, 10, 20)
خروجی :
Result: 129
Result: 30
توابع تو در تو
یک تابع تو در تو این امکان را فراهم می کند که تابع بیرونی را با فراخوانی تابع داخلی فراخوانی کند.
func calcDecrement(forDecrement total: Int) -> () -> Int {
var overallDecrement = 0
func decrementer() -> Int {
overallDecrement -= total
return overallDecrement
}
return decrementer
}
let decrem = calcDecrement(forDecrement: 30)
print(decrem())
خروجی :
-30
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
زندگي در حين گرفتن چيزهايي از تو موقعيت هاي جديدي را مي بخشد