سوئیفت یک زبان برنامه نویسی کامپایل شده چند پارادایم و همه منظوره سطح بالا است که توسط Chris Lattner در سال 2010 برای Apple Inc. ایجاد شد و توسط جامعه منبع باز نگهداری می شود . سوئیفت در کد ماشین کامپایل می شود و از یک کامپایلر مبتنی بر LLVM استفاده می کند . سوئیفت برای اولین بار در ژوئن 2014 منتشر شد [11] و زنجیره ابزار سوئیفت از نسخه 6 که در سال 2014 منتشر شد در Xcode ارسال شد .
اپل در نظر داشت Swift از بسیاری از مفاهیم اصلی مرتبط با Objective-C پشتیبانی کند ، بهویژه ارسال پویا ، اتصال دیرهنگام گسترده ، برنامهنویسی قابل توسعه ، و ویژگیهای مشابه، اما به روشی «ایمنتر» که گرفتن اشکالات نرمافزاری را آسانتر میکند . سوئیفت دارای ویژگی هایی است که برخی از خطاهای برنامه نویسی رایج مانند عدم ارجاع اشاره گر تهی را برطرف می کند و قند نحوی را برای جلوگیری از هرم عذاب ارائه می دهد . سوئیفت از مفهوم توسعه پذیری پروتکل پشتیبانی می کند ، یک سیستم توسعه پذیری که می تواند برای انواع، ساختارها و کلاس ها اعمال شود ، که اپل آن را به عنوان یک تغییر واقعی در پارادایم های برنامه نویسی ترویج می کند که آنها آن را "برنامه نویسی پروتکل گرا" می نامند [12] (شبیه به صفات و کلاس های نوع). ). [13]
سوئیفت در کنفرانس جهانی توسعه دهندگان اپل در سال 2014 (WWDC) معرفی شد. [14] در طول سال 2014 به نسخه 1.2 ارتقا یافت و در WWDC 2015 به سوئیفت 2 ارتقا یافت . برای پلتفرم های اپل و لینوکس . [15] [16]
از طریق نسخه 3.0، نحو سوئیفت با تکامل قابل توجهی روبرو شد، با تیم اصلی تمرکز بر ثبات منبع در نسخههای بعدی. [17] [18] در سه ماهه اول سال 2018 سوئیفت در محبوبیت اندازه گیری شده از Objective-C پیشی گرفت . [19]
سوئیفت 4.0 که در سال 2017 منتشر شد، تغییرات زیادی را در برخی کلاسها و ساختارهای داخلی ایجاد کرد. کدهای نوشته شده با نسخههای قبلی سوئیفت را میتوان با استفاده از قابلیت مهاجرت ساخته شده در Xcode بهروزرسانی کرد. Swift 5 که در مارس 2019 منتشر شد، یک رابط باینری پایدار را در پلتفرمهای اپل معرفی کرد که به زمان اجرا Swift اجازه میدهد تا در سیستمعاملهای اپل گنجانده شود. این منبع با سوئیفت 4 سازگار است. [20]
سوئیفت 5.1 به طور رسمی در سپتامبر 2019 منتشر شد. سوئیفت 5.1 بر اساس نسخه قبلی سوئیفت 5 با گسترش ویژگی های پایدار زبان به زمان کامپایل با معرفی پایداری ماژول ساخته شده است. معرفی پایداری ماژول امکان ایجاد و اشتراکگذاری چارچوبهای باینری را فراهم میکند که با نسخههای آینده سوئیفت کار میکنند. [21]
سوئیفت 5.5 که به طور رسمی توسط اپل در WWDC 2021 معرفی شد ، پشتیبانی زبانی را برای همزمانی و کدهای ناهمزمان به طور قابل توجهی گسترش میدهد و بهویژه نسخه منحصربهفردی از مدل بازیگر را معرفی میکند . [22]
سوئیفت 5.9، در سپتامبر 2023 منتشر شد و شامل یک سیستم ماکرو، بسته های پارامترهای عمومی و ویژگی های مالکیت مانند consume
اپراتور جدید است. [23]
Swift 5.10، در مارس 2024 منتشر شد. این نسخه مدل همزمانی زبان را بهبود میبخشد و امکان جداسازی کامل دادهها را برای جلوگیری از مسابقه دادهها فراهم میکند . همچنین آخرین نسخه قبل از سوئیفت 6 است. [24] نسخه 5.10 در حال حاضر برای macOS، ویندوز و لینوکس در دسترس است. [25]
سوئیفت 6 در سپتامبر 2024 منتشر شد. [26]
توسعه سوئیفت در جولای 2010 توسط کریس لاتنر و با همکاری بسیاری از برنامه نویسان دیگر در اپل آغاز شد . انگیزه سوئیفت نیاز به جایگزینی برای زبان برنامه نویسی قبلی Objective-C اپل بود که از اوایل دهه 1980 تا حد زیادی بدون تغییر بود و فاقد ویژگی های زبان مدرن بود. سوئیفت ایدههای زبانی را از Objective-C ، Rust ، Haskell ، Ruby ، Python ، C# ، CLU ، و بسیاری دیگر برای فهرست کردن استفاده کرد. [7] در 2 ژوئن 2014، برنامه کنفرانس توسعه دهندگان جهانی اپل (WWDC) اولین برنامه منتشر شده عمومی شد که با سوئیفت نوشته شد. [27] یک نسخه بتا از زبان برنامه نویسی برای توسعه دهندگان ثبت نام شده اپل در کنفرانس منتشر شد، اما این شرکت قول نداد که نسخه نهایی سوئیفت کد منبع سازگار با نسخه آزمایشی باشد. اپل قصد داشت در صورت نیاز برای انتشار کامل، مبدلهای کد منبع را در دسترس قرار دهد. [27]
زبان برنامه نویسی سوئیفت ، یک کتابچه راهنمای رایگان 500 صفحه ای نیز در WWDC منتشر شد و در فروشگاه کتاب اپل و وب سایت رسمی موجود است. [28]
Swift در 9 سپتامبر 2014 با Gold Master Xcode 6.0 برای iOS به نقطه عطف 1.0 رسید . [29] سویفت 1.1 در 22 اکتبر 2014 همراه با راه اندازی Xcode 6.1 منتشر شد. [30] سوئیفت 1.2 در 8 آوریل 2015 همراه با Xcode 6.3 منتشر شد. [31] Swift 2.0 در WWDC 2015 اعلام شد و در 21 سپتامبر 2015 برای انتشار برنامه ها در App Store در دسترس قرار گرفت. [32] Swift 3.0 در 13 سپتامبر 2016 منتشر شد. [33] Swift 4.0 در سپتامبر منتشر شد. 19، 2017. [34] سوئیفت 4.1 در 29 مارس 2018 منتشر شد. [35]
سوئیفت مقام اول را برای محبوب ترین زبان برنامه نویسی در نظرسنجی توسعه دهندگان Stack Overflow در سال 2015 [36] و مقام دوم را در سال 2016 کسب کرد. [37]
در 3 دسامبر 2015، زبان سوئیفت، کتابخانههای پشتیبان، اشکالزدا و مدیر بسته تحت مجوز Apache 2.0 با یک استثنای Runtime Library، منبع باز شد، [38] و Swift.org برای میزبانی پروژه ایجاد شد. کد منبع در GitHub میزبانی میشود، جایی که برای هر کسی آسان است که کد را دریافت کند، خودش آن را بسازد، و حتی درخواستهای کششی برای کمک کردن کد به پروژه ایجاد کند.
در دسامبر 2015، IBM وب سایت Swift Sandbox خود را معرفی کرد که به توسعه دهندگان اجازه می دهد کد سوئیفت را در یک صفحه بنویسند و خروجی را در دیگری نمایش دهند. [39] [40] [41] Swift Sandbox در ژانویه 2018 منسوخ شد. [42]
در طول WWDC 2016 ، اپل یک برنامه انحصاری برای آیپد به نام Swift Playgrounds را معرفی کرد که قصد دارد به مردم نحوه کدنویسی در سوئیفت را آموزش دهد. این برنامه در یک رابط بازی ویدیویی سه بعدی ارائه شده است که وقتی خطوط کد به ترتیب خاصی قرار می گیرند و اجرا می شوند بازخورد ارائه می کند. [43] [44] [45]
در ژانویه 2017، کریس لاتنر اعلام کرد که از اپل برای یک موقعیت جدید در تسلا موتورز جدا می شود و نقش اصلی پروژه سوئیفت به تد کرمنک کهنه کار تیم می رسد. [46] [47]
در جریان WWDC 2019، اپل SwiftUI را با Xcode 11 معرفی کرد که چارچوبی را برای طراحی ساختار رابط کاربری اعلامی در تمام پلتفرمهای اپل فراهم میکند. [48]
دانلودهای رسمی SDK و زنجیره ابزار برای توزیع اوبونتو لینوکس از زمان سوئیفت 2.2 در دسترس بوده است، با توزیع های بیشتری از سویفت 5.2.4، CentOS و لینوکس آمازون. [49] یک SDK غیر رسمی و بسته ابزار بومی برای اندروید نیز وجود دارد. [50] [51]
پلتفرم هایی که سوئیفت پشتیبانی می کند سیستم عامل های اپل ( داروین ، iOS ، iPadOS ، macOS ، tvOS ، watchOS )، لینوکس ، ویندوز و اندروید هستند . [52] [53]
یکی از جنبههای کلیدی طراحی سوئیفت، توانایی آن در تعامل با حجم عظیم کدهای Objective-C موجود است که در دهههای گذشته برای محصولات اپل مانند Cocoa و چارچوبهای Cocoa Touch توسعه یافتهاند . در پلتفرمهای اپل، [54] با کتابخانه زمان اجرا Objective-C پیوند میخورد که به کدهای C ، Objective-C ، C++ و Swift اجازه میدهد در یک برنامه اجرا شوند. [55]
سوئیفت یک زبان برنامه نویسی با هدف عمومی است که از مفاهیم تئوری زبان برنامه نویسی مدرن استفاده می کند و تلاش می کند یک نحو ساده و در عین حال قدرتمند ارائه دهد. سوئیفت نوآوری ها و قراردادهای زبان های برنامه نویسی مختلف را با الهام از Objective-C که به عنوان زبان اصلی توسعه در پلتفرم های اپل جایگزین شده است، ترکیب می کند.
سوئیفت به گونه ای طراحی شده است که برای برنامه نویسان جدید ایمن و دوستانه باشد در حالی که سرعت را فدا نمی کند. به طور پیش فرض سوئیفت تمام حافظه را به صورت خودکار مدیریت می کند و اطمینان حاصل می کند که متغیرها همیشه قبل از استفاده مقداردهی اولیه می شوند. دسترسی های آرایه برای خطاهای خارج از محدوده بررسی می شوند و عملیات اعداد صحیح برای سرریز بررسی می شوند. نام پارامترها اجازه ایجاد APIهای واضح را می دهد. پروتکلها رابطهایی را تعریف میکنند که انواع ممکن است اتخاذ کنند، در حالی که برنامههای افزودنی به توسعهدهندگان اجازه میدهند تا عملکرد بیشتری به انواع موجود اضافه کنند. سوئیفت برنامهنویسی شیگرا را با پشتیبانی از کلاسها ، تایپهای فرعی و نادیده گرفتن روشها فعال میکند . اختیاری اجازه می دهد که مقادیر صفر به طور صریح و ایمن مدیریت شوند. برنامههای همزمان را میتوان با استفاده از syntax async/wait نوشت و بازیگران حالت تغییرپذیر مشترک را به منظور حذف رقابتهای داده ایزوله میکنند. [72] [73]
نحو سوئیفت شبیه زبان های سبک C است. کد به طور پیش فرض در محدوده جهانی اجرا می شود. [74] از طرف دیگر، ویژگی را می توان از یک ساختار، کلاس یا اعلان شمارش استفاده کرد تا نشان دهد که حاوی نقطه ورودی برنامه است. [75]@main
سوئیفت "سلام، جهان!" برنامه این است:
چاپ ( "سلام، دنیا!" )
تابع مورد استفاده در اینجا در کتابخانه استاندارد سوئیفت گنجانده شده است که برای همه برنامه ها بدون نیاز به وارد کردن ماژول های خارجی در دسترس است. دستورات در سوئیفت لازم نیست با نقطه ویرگول خاتمه پیدا کنند، با این حال برای جدا کردن چند عبارت نوشته شده در یک خط، نقطه ویرگول لازم است. نظرات تک خطی با خط فعلی شروع می شود و تا پایان خط فعلی ادامه می یابد. نظرات چندخطی بر اساس و کاراکترها موجود است . ثابت ها با کلمه کلیدی و متغیرها با کلمه کلیدی اعلام می شوند. مقادیر باید قبل از خواندن مقداردهی اولیه شوند. مقادیر ممکن است نوع خود را بر اساس نوع مقدار اولیه ارائه شده استنتاج کنند. اگر مقدار اولیه پس از اعلام مقدار تنظیم شود، یک نوع باید به صراحت اعلام شود. [74]print(_:separator:terminator:)
//
/*
*/
let
var
اجازه دهید highScoreThreshold = 1000 // یک ثابت با نوع Int. نوع بر اساس مقدار ارائه شده استنباط شد.var currentScore = 980 // متغیری با نوع Int.CurrentScore = 1200 // مقدار متغیرها می تواند در طول زمان تغییر کند.let playerMessage : String // یک ثابت با نوع صریح String.if currentScore > highScoreThreshold { playerMessage = "شما یک بازیکن برتر هستید!"} دیگر { playerMessage = "دفعه بعد موفق تر باشید."}print ( playerMessage ) // چاپ "شما بازیکن برتر هستید!"
جریان کنترل در سوئیفت با دستورهای if-else ، guard و switch ، همراه با حلقههای while و for-in مدیریت میشود . عبارات یک پارامتر بولی را می گیرند و در صورت درست بودن شرط، بدنه عبارت را اجرا می کنند ، در غیر این صورت بدنه اختیاری را اجرا می کند. syntax قند نحوی را برای بررسی وجود یک مقدار اختیاری و باز کردن آن در همان زمان فراهم می کند.if
if
else
if-let
اجازه دهید someNumber = 42if someNumber % 2 == 0 { // از عملگر باقیمانده برای یافتن باقیمانده someNumber تقسیم بر 2 استفاده کنید. print ( " \( someNumber ) زوج است." )} دیگر { چاپ ( " \( someNumber ) فرد است." )}// چاپ "42 برابر است."
توابع با
کلمه کلیدی تعریف می شوند. پارامترهای تابع ممکن است دارای نام هایی باشند که به فراخوانی تابع اجازه می دهد مانند عبارات بخواند. یک خط زیر قبل از نام پارامتر اجازه می دهد تا برچسب آرگومان از سایت تماس حذف شود. تاپل ها را می توان توسط توابع برای برگرداندن چندین قطعه داده به طور همزمان استفاده کرد.func
func constructGreeting ( برای نام : String ) -> String { بازگشت "سلام \( نام ) !"}let greeting = constructGreeting ( برای : "کریگ" )print ( تبریک ) // چاپ "Hello Craig!"
توابع، و توابع ناشناس که به عنوان بسته شدن شناخته می شوند ، می توانند به ویژگی ها اختصاص داده شوند و مانند هر مقدار دیگری در اطراف برنامه ارسال شوند.
func divideByTwo ( _ aNum : Int ) -> Int { برگرداندن aNum / 2}func multiplyByTwo ( _ aNum : Int ) -> Int { aNum * 2 را برگردانید}اجازه دهید mathOperation = multiplyByTwoprint ( mathOperation ( 21 )) // چاپ "42"
عبارات مستلزم این هستند که شرط داده شده قبل از ادامه دادن به دستور، درست باشد guard
، در غیر این صورت متن guard
بند ارائه شده اجرا می شود. بند else
باید از کنترل بلوک کدی که else
عبارت در آن ظاهر می شود خارج شود. guard
عبارات برای اطمینان از برآورده شدن برخی الزامات قبل از ادامه اجرای برنامه مفید هستند. بهویژه میتوان از آنها برای ایجاد یک نسخه بدون بستهبندی از یک مقدار اختیاری استفاده کرد که تضمین میشود برای باقیمانده محدوده محصور، غیر صفر باشد.guard
تقسیم تابع ( عدد : Int ?، توسط مخرج مخرج : Int ) -> Int ? { مخرج نگهبان != 0 other { چاپ ( "نمی توان بر 0 تقسیم کرد." ) برگردان صفر } نگهبان اجازه اعمارگر دیگر { چاپ ( "عدد ارائه شده صفر است." ) برگردان صفر } برگردان صورت / مخرج}اجازه دهید نتیجه = تقسیم ( عدد : 3 , با مخرج : 0 )print ( "نتیجه تقسیم: \( نتیجه ) " )// چاپ:// "نمی توان بر 0 تقسیم کرد."// "نتیجه تقسیم: صفر است."
switch
دستورات یک مقدار را با چندین مقدار بالقوه مقایسه می کنند و سپس یک بلوک کد مرتبط را اجرا می کنند. switch
عبارات باید جامع باشند، یا با گنجاندن موارد برای همه مقادیر ممکن یا با گنجاندن default
موردی که زمانی اجرا می شود که مقدار ارائه شده با هیچ یک از موارد دیگر مطابقت ندارد. switch
موارد به طور ضمنی از بین نمی روند، اگرچه ممکن است به صراحت این کار را با fallthrough
کلمه کلیدی انجام دهند. تطبیق الگو را می توان به روش های مختلفی در داخل switch
دستورات استفاده کرد. در اینجا مثالی از تطبیق یک عدد صحیح با تعدادی محدوده پتانسیل آورده شده است:
اجازه دهید someNumber = 42سوئیچ someNumber {مورد ..< 0 : چاپ ( " \( someNumber ) منفی." )مورد 0 : چاپ ( " \( someNumber ) 0 است." )مورد 1 ... 9 : چاپ ( " \( someNumber ) بزرگتر از 0، اما کمتر از 10." )پیش فرض : print ( " \( someNumber ) بزرگتر از 9 است." )}// چاپ "42 بزرگتر از 9 است."
for-in
حلقه ها روی یک دنباله از مقادیر تکرار می شوند:
let names = [ "ویل" ، "آنا" ، "بارت" ]برای نام در نامها { چاپ ( نام )}// چاپ:// اراده// آنا// بارت
while
حلقه ها تا زمانی تکرار می شوند که شرط بولی داده شده به صورت زیر ارزیابی شود true
:
// تمام اعداد از 1 تا 5 را با هم جمع کنید.var i = 1 نتیجه var = 0در حالی که i <= 5 { // حلقه تا زمانی که i کمتر یا مساوی 5 باشد بدن خود را انجام می دهد. نتیجه += i // i را به نتیجه فعلی اضافه کنید. i += 1 // i را 1 افزایش دهید.}چاپ ( نتیجه ) // چاپ "15"
سوئیفت از بستهها پشتیبانی میکند ، که بلوکهای عملکردی مستقلی هستند که میتوانند در اطراف منتقل شوند و در کد استفاده شوند، [76] و همچنین میتوانند به عنوان توابع ناشناس استفاده شوند . در اینجا چند نمونه آورده شده است:
// نوع بسته شدن، که با مقادیر ورودی و خروجی آن تعریف می شود، می تواند خارج از بسته شدن مشخص شود:let closure1 : ( Int , Int ) -> Int = { arg1 , arg2 در arg1 + arg2 را برگردانید}// … یا داخل آن:اجازه دهید closure2 = { ( arg1 : Int , arg2 : Int ) -> Int in arg1 + arg2 را برگردانید}// در بیشتر موارد، نوع بازگشت بسته شدن را می توان به طور خودکار توسط کامپایلر استنباط کرد.اجازه دهید closure3 = { arg1 : Int , arg2 : Int in arg1 + arg2 را برگردانید}
بستهها را میتوان به متغیرها و ثابتها اختصاص داد و میتوان آن را بهعنوان پارامتر به توابع یا بستههای دیگر منتقل کرد. بسته شدن تک بیان ممکن است return
کلمه کلیدی را حذف کند.
Swift همچنین دارای یک نحو بسته شدن انتهایی است که اجازه می دهد تا بسته شدن پس از پایان فراخوانی تابع به جای در لیست پارامترهای تابع نوشته شود. اگر بسته شدن تنها پارامتر تابع باشد، پرانتزها را می توان به طور کلی حذف کرد:
// این تابع یک بسته می گیرد که هیچ پارامتر ورودی دریافت نمی کند و یک عدد صحیح برمی گرداند.// آن را ارزیابی می کند و از مقدار بازگشتی بسته (یک Int) به عنوان مقدار بازگشتی تابع استفاده می کند.func foo ( نوار بسته : () -> Int ) -> Int { نوار برگشت ()}// بدون سینتکس بسته شدن دنباله:foo ( بستن : { return 1 })// با نحو بسته شدن انتهایی و بازگشت ضمنی:فوو { 1 }
با شروع از نسخه 5.3، سوئیفت از بسته شدن های چندگانه انتهایی پشتیبانی می کند: [77]
// این تابع بازگشت بسته شدن اول را به عنوان پارامتر دومی، // می دهد و نتیجه بسته شدن دوم را برمی گرداند: func foo ( bar : () -> Int , baz : ( Int ) -> Int ) -> Int { بازگرداندن باز ( نوار ()) }// بدون بسته شدن انتهایی: foo ( bar : { return 1 }, baz : { x in return x + 1 })// با 1 بسته شدن انتهایی: foo ( نوار : { بازگشت 1 }) { x در بازگشت x + 1 }// با 2 بسته شدن انتهایی (فقط نام آرگومان بسته اول حذف شده است): foo { return 1 } baz : { x in return x + 1 }
سوئیفت نامهای آرگومان کوتاهنویسی را برای بستههای درون خطی ارائه میکند و نیاز به نامگذاری صریح همه پارامترهای بسته شدن را از بین میبرد. [78] آرگومان ها را می توان با نام های $0، $1، $2 و غیره نام برد:
let names = [ "جوزفین" ، "استیو" ، "کریس" ، "باربارا" ]// filter بسته داده شده را برای هر مقدار در نام فراخوانی می کند. // مقادیر با تعداد کاراکتر کمتر از 6 نگه داشته می شوند، بقیه حذف می شوند. اجازه دهید shortNames = نامها . فیلتر { 0 $ . شمارش < 6 }print ( shortNames ) // چاپ "["Steve", "Chris"]"
بسته ها ممکن است مقادیری را از محدوده اطراف خود بگیرند. تا زمانی که بسته شدن وجود دارد، بسته شدن به این مقدار گرفته شده اشاره خواهد کرد:
func makeMultiplier ( withMultiple multiple : Int ) -> ( Int ) -> ( Int ) { // بستنی ایجاد کرده و برمی گرداند که یک Int می گیرد و ورودی ضرب شده در مقدار multiple را برمی گرداند. بازگشت { 0 $ * چندگانه } }let multiplier = makeMultiplier ( withMultiple : 3 ) print ( multiplier ( 3 )) // چاپ "9" چاپ ( ضرب ( 10 )) // چاپ "30"
کتابخانه استاندارد سوئیفت شامل انواع String
و یونیکد سازگار است Character
. مقادیر رشته را می توان با یک String literal، دنباله ای از کاراکترهای احاطه شده با علامت های نقل قول دوگانه، مقداردهی اولیه کرد. رشته ها را می توان با +
عملگر الحاق کرد:
var someString = "سلام" someString += "دنیا!"
درون یابی رشته ای امکان ایجاد یک رشته جدید از مقادیر و عبارات دیگر را فراهم می کند. مقادیر نوشته شده بین پرانتز قبل از a \
در رشته لفظی درج می شود: [79]
var currentScore = 980 print ( "امتیاز شما \( currentScore ) است ." )// چاپ "امتیاز شما 980 است."
یک حلقه for-in می تواند برای تکرار بر روی کاراکترهای موجود در یک رشته استفاده شود:
برای کاراکتر در "Swift" { print ( character ) } // S // w // i // f // t
هنگامی که چارچوب بنیاد وارد می شود، سوئیفت به طور نامرئی نوع String را به NSString، کلاس String که معمولاً در Objective-C استفاده می شود، پل می کند.
در سوئیفت، اشیاء قابل فراخوانی با استفاده از callAsFunction
. [80]
struct CallableStruct { var value : Int func callAsFunction ( _ number : Int , scale : Int ) { print ( scale * ( number + value ) ) } let callable = CallableStruct ( مقدار : 100 ) callable ( 4 , scale : 2 ) callable . callAsFunction ( 4 ، مقیاس : 2 ) // هر دو تابع چاپ 208 را فراخوانی میکنند.
سوئیفت از پنج سطح کنترل دسترسی برای نمادها پشتیبانی می کند: open
, public
, internal
, fileprivate
و private
. برخلاف بسیاری از زبانهای شی گرا، این کنترلهای دسترسی سلسله مراتب ارث را نادیده میگیرند : نشان میدهد که یک نماد فقط در محدودهprivate
فوری قابل دسترسی است ، نشان میدهد که فقط از داخل فایل قابل دسترسی است، نشان میدهد که در ماژول حاوی قابل دسترسی است، نشان میدهد که از طریق ماژول قابل دسترسی است . هر ماژول، و (فقط برای کلاس ها و متدهای آنها) نشان می دهد که کلاس ممکن است خارج از ماژول زیر کلاس قرار گیرد. [81]fileprivate
internal
public
open
یکی از ویژگیهای مهم در سوئیفت ، انواع گزینهها است که به مراجع یا مقادیر اجازه میدهد به روشی مشابه الگوی رایج در C عمل کنند ، جایی که یک اشارهگر ممکن است به یک مقدار خاص اشاره کند یا اصلاً هیچ مقداری را نداشته باشد. این بدان معناست که انواع غیر اختیاری نمی توانند منجر به خطای اشاره گر تهی شوند . کامپایلر می تواند اطمینان حاصل کند که این امکان پذیر نیست.
انواع اختیاری با Optional
enum ایجاد می شوند. برای ساختن یک عدد صحیح که باطل باشد، باید از یک اعلان مشابه استفاده کرد var optionalInteger: Optional<Int>
. همانطور که در سی شارپ، [82] سوئیفت همچنین شامل قند نحوی برای این کار میشود، که با قرار دادن علامت سوال بعد از نام نوع، اجازه میدهد تا یک متغیر را انتخابی نشان دهد var optionalInteger: Int?
. [83] متغیرها یا ثابتهایی که به صورت اختیاری علامتگذاری شدهاند یا مقداری از نوع زیربنایی دارند یا nil
. انواع اختیاری نوع پایه را می پیچند و در نتیجه نمونه متفاوتی ایجاد می شود. String
و String?
اساساً انواع مختلفی دارند، اولی از نوع است String
در حالی که دومی Optional
ممکن است مقداری ارزش داشته باشد String
.
برای دسترسی به مقدار داخل، با فرض اینکه صفر نباشد، باید آن را باز کرد تا نمونه داخل نمایان شود. این کار با !
اپراتور انجام می شود:
اجازه دهید myValue = anOptionalInstance !. روشی ()
در این حالت، !
اپراتور باز میشود anOptionalInstance
تا نمونهای را در داخل نمایش دهد و اجازه میدهد تا متد فراخوانی روی آن انجام شود. اگر anOptionalInstance
صفر باشد، یک خطای اشاره گر تهی رخ می دهد و برنامه را خاتمه می دهد. این به عنوان باز کردن نیرو شناخته می شود. گزینههای اختیاری را میتوان با استفاده از زنجیرهای اختیاری باز کرد که ابتدا صفر بودن نمونه را آزمایش میکند و سپس در صورت غیر پوچ بودن آن را باز میکند:
اجازه دهید myValue = anOptionalInstance ?. روشی ()
در این حالت زمان اجرا someMethod
فقط در صورتی تماس می گیرد که anOptionalInstance
صفر نباشد، خطا را سرکوب می کند. باید ?
بعد از هر ویژگی اختیاری قرار گیرد. اگر هر یک از این ویژگی ها صفر باشد، کل عبارت به عنوان صفر ارزیابی می شود. منشاء اصطلاح زنجیرهسازی از مورد رایجتری میآید که در آن چندین فراخوانی/گیرنده متد به هم زنجیر شدهاند. به عنوان مثال:
let atenant = aBuilding . tenantList [ 5 ] let theirLease = aTenant . leaseDetails اجازه دهید leaseStart = theirLease ?. تاریخ شروع
را می توان به:
letaseStart = aBuilding . tenantList [ 5 ]. اجاره جزئیات ?. تاریخ شروع
استفاده سوئیفت از اختیاریها به کامپایلر اجازه میدهد تا از ارسال استاتیک استفاده کند ، زیرا عمل بازکردن در یک نمونه تعریفشده (Wrapper) فراخوانی میشود، در حالی که در یک سیستم ارسال زمان اجرا رخ میدهد.
در بسیاری از زبان های شی گرا، اشیا به صورت داخلی در دو بخش نمایش داده می شوند. شی به عنوان یک بلوک از داده های قرار داده شده روی پشته ذخیره می شود ، در حالی که نام (یا "دسته") آن شی با یک اشاره گر نشان داده می شود . اشیاء با کپی کردن مقدار اشاره گر بین متدها ارسال می شوند، و این امکان را می دهد که هر کسی که یک کپی دارد به همان داده های زیربنایی روی پشته دسترسی پیدا کند. در مقابل، انواع پایه مانند اعداد صحیح و مقادیر ممیز شناور به طور مستقیم نمایش داده می شوند. دسته شامل دادهها است، نه اشارهگر به آن، و آن دادهها مستقیماً با کپی کردن به روشها منتقل میشوند. این سبکهای دسترسی در مورد اشیاء، مرجع عبور و برای انواع پایه ، مقدار عبور نامیده میشوند .
هر دو مفهوم مزایا و معایب خود را دارند. اشیاء زمانی مفید هستند که داده ها بزرگ باشند، مانند توضیحات یک پنجره یا محتوای یک سند. در این موارد، دسترسی به آن داده ها با کپی کردن یک مقدار 32 یا 64 بیتی در مقابل کپی کردن کل ساختار داده فراهم می شود. با این حال، مقادیر کوچکتر مانند اعداد صحیح به اندازه اشاره گرها هستند (معمولاً هر دو یک کلمه هستند )، بنابراین هیچ مزیتی برای ارسال یک اشاره گر در مقابل ارسال مقدار وجود ندارد.
سوئیفت پشتیبانی داخلی برای اشیاء با استفاده از معنایی رمز عبور یا ارزش عبور ارائه می دهد، اولی از class
اعلان و دومی با استفاده از struct
. ساختارها در سوئیفت تقریباً همه ویژگیهای مشابه کلاسها را دارند: روشها، پیادهسازی پروتکلها و استفاده از مکانیسمهای توسعه. به همین دلیل، اپل همه دادهها را بهعنوان نمونهها ، در مقابل اشیا یا مقادیر مینامد. با این حال، ساختارها از وراثت پشتیبانی نمی کنند. [84]
برنامه نویس آزاد است که انتخاب کند که کدام معنا برای هر ساختار داده در برنامه مناسب تر است. ساختارهای بزرگتر مانند پنجره ها به عنوان کلاس تعریف می شوند و به آنها اجازه می دهند به عنوان اشاره گر منتقل شوند. ساختارهای کوچکتر، مانند یک نقطه دو بعدی، می توانند به عنوان ساختارهایی تعریف شوند که ارزش عبوری هستند و امکان دسترسی مستقیم به داده های داخلی خود را بدون هیچ گونه غیر جهت یا شمارش مرجع فراهم می کنند. بهبود عملکرد ذاتی مفهوم مقدار عبور به گونهای است که سوئیفت از این انواع برای تقریباً همه انواع دادههای رایج، از جمله Int
و Double
، و انواعی که معمولاً با اشیاء نشان داده میشوند، مانند String
و Array
. [84] استفاده از انواع ارزش می تواند منجر به بهبود عملکرد قابل توجهی در برنامه های کاربردی کاربر نیز شود. [85]
Array
، Dictionary
و Set
همه از کپی در نوشتن استفاده می کنند تا داده های آنها فقط در صورت و زمانی کپی شود که برنامه سعی کند مقداری را در آنها تغییر دهد. این به این معنی است که دسترسیهای مختلف در واقع یک اشارهگر به یک ذخیرهسازی داده دارند. بنابراین در حالی که داده ها به صورت فیزیکی به عنوان یک نمونه در حافظه ذخیره می شوند، در سطح برنامه، این مقادیر جدا هستند و جداسازی فیزیکی تنها در صورت نیاز با کپی در نوشتن اعمال می شود. [86]
برنامههای افزودنی بدون نیاز به زیر کلاس یا حتی دسترسی به کد منبع اصلی، عملکرد جدیدی را به نوع موجود اضافه میکنند. برنامههای افزودنی میتوانند روشهای جدید، مقداردهی اولیه، ویژگیهای محاسبهشده، زیرنویسها و انطباقهای پروتکل را اضافه کنند. [87] یک مثال ممکن است اضافه کردن یک غلطگیر املا به String
نوع پایه باشد، که به این معنی است که همه نمونههای موجود String
در برنامه توانایی بررسی املا را دارند. این سیستم همچنین به طور گسترده به عنوان یک تکنیک سازمانی مورد استفاده قرار می گیرد و به کدهای مرتبط اجازه می دهد تا در پسوندهای کتابخانه مانند جمع آوری شوند.
پسوندها با extension
کلمه کلیدی اعلان می شوند.
ساخت مستطیل { عرض : دو برابر شود اجازه دهید ارتفاع : دو برابر}پسوند مستطیل { ناحیه var : دو برابر { ارتفاع بازگشت * عرض }}
پروتکلها قول میدهند که یک نوع خاص مجموعهای از متدها یا ویژگیها را پیادهسازی میکند، به این معنی که سایر نمونهها در سیستم میتوانند آن متدها را بر روی هر نمونهای که آن پروتکل را پیادهسازی میکند فراخوانی کنند. این اغلب در زبان های شی گرا مدرن به عنوان جایگزینی برای وراثت چندگانه استفاده می شود ، اگرچه مجموعه ویژگی ها کاملاً مشابه نیستند.
در Objective-C و بسیاری از زبانهای دیگر که مفهوم پروتکل را پیادهسازی میکنند، این بر عهده برنامهنویس است که اطمینان حاصل کند که متدهای مورد نیاز در هر کلاس پیادهسازی میشوند. [88] سوئیفت توانایی اضافه کردن این روشها را با استفاده از افزونهها و استفاده از برنامهنویسی عمومی (عمومی) برای پیادهسازی آنها اضافه میکند. در ترکیب، اینها اجازه می دهند پروتکل ها یک بار نوشته شوند و نمونه های بسیار متنوعی را پشتیبانی می کنند. همچنین، مکانیسم توسعه را می توان برای افزودن انطباق پروتکل به یک شی که آن پروتکل را در تعریف خود فهرست نمی کند، استفاده کرد. [89]
به عنوان مثال، یک پروتکل ممکن است نامیده شود Printable
، که تضمین می کند که نمونه هایی که با پروتکل مطابقت دارند، یک description
ویژگی و یک printDetails()
نیاز متد را اجرا می کنند:
// تعریف یک پروتکل به نام پروتکل قابل چاپ Printable { var description : String { get } // یک ویژگی مورد نیاز فقط خواندنی func printDetails () // یک روش الزامی }
این پروتکل اکنون می تواند توسط انواع دیگر پذیرفته شود:
// پروتکل قابل چاپ را در کلاس کلاس بپذیرید MyClass : Printable { var description : String { return "A instance of MyClass" } func printDetails () { print ( توضیحات ) } }
از برنامه های افزودنی می توان برای افزودن انطباق پروتکل به انواع استفاده کرد. خود پروتکلها نیز میتوانند برای ارائه پیادهسازی پیشفرض نیازمندیهایشان گسترش یابند. پذیرندگان ممکن است پیاده سازی های خود را تعریف کنند، یا ممکن است از پیاده سازی پیش فرض استفاده کنند:
افزونه قابل چاپ { // همه نمونههای قابل چاپ این پیادهسازی را دریافت میکنند، یا ممکن است خود را تعریف کنند. func printDetails () { print ( توضیحات ) } }// Bool اکنون با Printable مطابقت دارد و اجرای printDetails() در بالا را به ارث می برد. extension Bool : Printable { var description : String { return "یک نمونه از Bool با مقدار: \( self ) " }}
در سوئیفت، مانند بسیاری از زبانهای مدرن که از رابطها پشتیبانی میکنند، پروتکلها را میتوان بهعنوان نوع استفاده کرد، به این معنی که متغیرها و روشها را میتوان بهجای نوع خاص آنها با پروتکل تعریف کرد:
func getSomethingPrintable () -> any Printable { return true }var someSortOfPrintableInstance = getSomethingPrintable () print ( someSortOfPrintableInstance . توضیحات )// چاپ "نمونه ای از Bool با مقدار: true"
مهم نیست نوع بتن چیست someSortOfPrintableInstance
، کامپایلر اطمینان حاصل می کند که با پروتکل مطابقت دارد و بنابراین این کد ایمن است. این نحو همچنین به این معنی است که مجموعه ها می توانند بر اساس پروتکل ها نیز مانند let printableArray = [any Printable]
.
هر دو برنامه افزودنی و پروتکل ها به طور گسترده در کتابخانه استاندارد سوئیفت استفاده می شوند. در سوئیفت 5.9، تقریباً 1.2 درصد از تمام نمادهای موجود در کتابخانه استاندارد پروتکل بودند و 12.3 درصد دیگر الزامات پروتکل یا پیاده سازی پیش فرض بودند. [90] برای مثال، سوئیفت از پسوندها برای افزودن Equatable
پروتکل به بسیاری از انواع اصلی آنها، مانند رشته ها و آرایه ها، استفاده می کند و به آنها اجازه می دهد با عملگر مقایسه شوند ==
. پروتکل Equatable
همچنین این پیاده سازی پیش فرض را تعریف می کند:
func !=< T : Equatable >( lhs : T , rhs : T ) -> Bool
این تابع روشی را تعریف میکند که روی هر نمونه مطابق با Equatable
، کار میکند و عملگر غیر برابر را ارائه میکند . هر نمونه، کلاس یا ساختار، به طور خودکار این پیاده سازی را به سادگی با تطبیق با Equatable
. [91]
پروتکلها، برنامههای افزودنی و ژنریک را میتوان برای ایجاد APIهای پیچیده ترکیب کرد. به عنوان مثال، محدودیتها به انواع اجازه میدهند تا به طور مشروط پروتکلها یا روشهایی را بر اساس ویژگیهای نوع پذیرش اتخاذ کنند. یک مورد استفاده رایج ممکن است فقط زمانی که عناصر موجود در مجموعه عبارتند از Equatable
:
پسوند آرایه که در آن عنصر : برابر { // allEqual فقط در نمونه هایی از Array که حاوی عناصر Equatable هستند در دسترس خواهد بود. func allEqual () -> Bool { for element in self { if element != self . اول { return false } } return true } }
سوئیفت 5.5 همزمانی ساختاریافته را به زبان معرفی کرد. [92] همزمانی ساختاریافته از نحو Async/wait مشابه Kotlin، JavaScript و Rust استفاده میکند. یک تابع async با async
کلمه کلیدی بعد از لیست پارامترها تعریف می شود. هنگام فراخوانی یک تابع همگام، await
کلمه کلیدی باید قبل از تابع نوشته شود تا نشان دهد که هنگام فراخوانی عملکرد، اجرا به طور بالقوه به حالت تعلیق در می آید. در حالی که یک تابع معلق است، برنامه ممکن است عملکرد همزمان دیگری را در همان برنامه اجرا کند. این نحو به برنامهها اجازه میدهد تا به وضوح نقاط تعلیق بالقوه را فراخوانی کنند و از نسخهای از هرم عذاب (برنامهنویسی) ناشی از استفاده گسترده قبلی از فراخوانهای بسته اجتناب کنند. [93]
func downloadText ( نام : رشته ) async -> String { let result = // ... مقداری کد دانلود ناهمزمان ... نتیجه را برگرداند }let text = منتظر دانلودمتن ( "text1" )
سینتکس async let
اجازه می دهد تا چندین توابع به صورت موازی اجرا شوند. await
مجدداً برای علامت گذاری نقطه ای استفاده می شود که در آن برنامه به حالت تعلیق در می آید تا منتظر تکمیل توابع async
فراخوانده شده قبلی باشد.
// هر یک از این فراخوانی ها به downloadText به صورت موازی اجرا می شود. async let text1 = downloadText ( نام : "text1" ) async let text2 = downloadText ( نام : "text2" ) async let text3 = downloadText ( نام : "text3" )let textToPrint = await [ text1 , text2 , text3 ] // تعلیق می شود تا زمانی که هر سه تماس downloadText برگردند. چاپ ( textToPrint )
Tasks و TaskGroups را می توان به صراحت برای ایجاد تعداد پویا از وظایف فرزند در طول زمان اجرا ایجاد کرد:
let taskHandle = Task { await downloadText ( نام : "someText" ) }let result = منتظر taskHandle . ارزش
سوئیفت از مدل Actor برای جداسازی حالت تغییرپذیر استفاده میکند و به وظایف مختلف اجازه میدهد حالت مشترک را به روشی ایمن تغییر دهند. بازیگران با actor
کلمه کلیدی اعلان می شوند و مانند کلاس ها انواع مرجع هستند. تنها یک کار ممکن است به حالت تغییرپذیر یک بازیگر به طور همزمان دسترسی داشته باشد. بازیگران ممکن است آزادانه به وضعیت داخلی خود دسترسی داشته باشند و آنها را تغییر دهند، اما کدی که در وظایف جداگانه اجرا می شود باید هر دسترسی را با await
کلمه کلیدی علامت گذاری کند تا نشان دهد که کد ممکن است تا زمانی که سایر وظایف دسترسی به وضعیت بازیگر را به پایان برسانند به حالت تعلیق درآید.
دایرکتوری بازیگر { نام var : [ رشته ] = [] func add ( نام : رشته ) { names . ضمیمه ( نام ) } }let directory = دایرکتوری ()// کد به حالت تعلیق در می آید تا زمانی که سایر وظایف دسترسی به بازیگر را تمام کنند. فهرست انتظار . افزودن ( نام : "Tucker" ) چاپ ( انتظار فهرست . نام ها )
در سیستمهای اپل، سوئیفت از زمان اجرا مشابه سیستم Objective-C موجود استفاده میکند ، اما به iOS 7 یا macOS 10.9 یا بالاتر نیاز دارد. همچنین به Grand Central Dispatch بستگی دارد . [94] کد Swift و Objective-C را می توان در یک برنامه استفاده کرد، و با پسوند، C و C++ نیز قابل استفاده است. با شروع Swift 5.9، کد C++ را می توان مستقیماً از کد Swift استفاده کرد. [95] در مورد Objective-C، سوئیفت دسترسی قابل توجهی به مدل شی دارد، و می تواند برای زیر کلاس، گسترش و استفاده از کد Objective-C برای ارائه پشتیبانی از پروتکل استفاده شود. [96] برعکس آن درست نیست: یک کلاس Swift را نمی توان در Objective-C زیر کلاس قرار داد. [97]
برای کمک به توسعه چنین برنامههایی و استفاده مجدد از کدهای موجود، Xcode 6 و بالاتر یک سیستم نیمه خودکار را ارائه میکند که یک هدر پل زدن را ایجاد و نگهداری میکند تا کد Objective-C را در معرض سوئیفت قرار دهد. این به شکل یک فایل هدر اضافی است که به سادگی تمام نمادهای Objective-C را که برای کد سوئیفت پروژه مورد نیاز است تعریف یا وارد می کند. در آن مرحله، سوئیفت می تواند به انواع، توابع و متغیرهای اعلام شده در آن واردات اشاره کند که گویی در سوئیفت نوشته شده اند. کد Objective-C همچنین میتواند مستقیماً از کد سوئیفت استفاده کند، با وارد کردن یک فایل هدر که به صورت خودکار نگهداری میشود با اعلانهای Objective-C نمادهای Swift پروژه. به عنوان مثال، یک فایل Objective-C در یک پروژه ترکیبی به نام "MyApp" می تواند به کلاس ها یا توابع سوئیفت با کد دسترسی پیدا کند #import "MyApp-Swift.h"
. با این حال، همه نمادها از طریق این مکانیسم در دسترس نیستند - استفاده از ویژگیهای خاص سوئیفت مانند انواع عمومی، انواع اختیاری غیر شیء، شمارههای پیچیده یا حتی شناسههای یونیکد ممکن است نمادی را از Objective-C غیرقابل دسترسی کند. [98]
سوئیفت همچنین دارای پشتیبانی محدودی از ویژگیها ، ابردادههایی است که توسط محیط توسعه خوانده میشوند و لزوماً بخشی از کد کامپایلشده نیستند. مانند Objective-C، ویژگی ها از @
نحو استفاده می کنند، اما مجموعه موجود در حال حاضر کوچک است. یک مثال @IBOutlet
، ویژگی است که مقدار معینی را در کد به عنوان خروجی علامتگذاری میکند که برای استفاده در Interface Builder (IB) در دسترس است. خروجی دستگاهی است که مقدار نمایشگر روی صفحه را به یک شی در کد متصل می کند .
در سیستمهای غیر اپل، سوئیفت به زمان اجرا Objective-C یا دیگر کتابخانههای سیستم اپل وابسته نیست. مجموعه ای از پیاده سازی های سوئیفت "Corelib" جایگزین آنها می شود. اینها شامل یک "swift-corelibs-foundation" برای قرار گرفتن در کیت بنیاد ، یک "swift-corelibs-libdispatch" برای ایستادن در Grand Central Dispatch، و یک "swift-corelibs-xctest" برای ایستادن در XCTest است. API از Xcode . [99]
از سال 2019، با Xcode 11، اپل یک پارادایم جدید رابط کاربری جدید به نام SwiftUI را نیز اضافه کرده است. SwiftUI پارادایم قدیمیتر Interface Builder را با یک الگوی توسعه اعلامی جدید جایگزین میکند. [100]
سوئیفت از شمارش خودکار مرجع (ARC) برای مدیریت حافظه استفاده می کند . هر نمونه از یک کلاس یا بسته شدن، تعداد مراجعی را حفظ می کند که یک آمار در حال اجرا از تعداد مراجعی را که برنامه نگه داشته است حفظ می کند. هنگامی که این تعداد به 0 رسید، نمونه مورد نظر توزیع می شود. این تخصیص خودکار نیاز به جمعآوری زباله را برطرف میکند، زیرا نمونهها به محض اینکه دیگر مورد نیاز نباشند، توزیع میشوند.
یک چرخه مرجع قوی می تواند اتفاق بیفتد اگر دو نمونه هر کدام به شدت به یکدیگر ارجاع دهند (مثلاً A به B، B مراجع A). از آنجایی که هیچکدام از نمونهها تعداد مراجع نمیتوانند به صفر برسند و هرگز تخصیص داده نمیشوند، که منجر به نشت حافظه میشود . سوئیفت کلمات کلیدی را فراهم می کند weak
و unowned
از چرخه های مرجع قوی جلوگیری می کند. این کلمات کلیدی امکان ارجاع یک نمونه را بدون افزایش تعداد مراجع آن فراهم می کنند. weak
مراجع باید متغیرهای اختیاری باشند، زیرا می توانند تغییر کنند و تبدیل شوند nil
. [101] تلاش برای دسترسی به unowned
مقداری که قبلاً اختصاص داده شده است منجر به خطای زمان اجرا می شود.
بسته شدن در یک کلاس همچنین می تواند یک چرخه مرجع قوی با گرفتن ارجاعات خود ایجاد کند. خود ارجاعاتی که به عنوان ضعیف یا ناشناس تلقی می شوند را می توان با استفاده از فهرست ضبط نشان داد.
نفر کلاس { نام بگذارید : رشته ضعیف var home : خانه ? // به عنوان یک مرجع ضعیف برای شکستن چرخه مرجع تعریف شده است. مراجع ضعیف تعداد مراجع نمونه ای را که به آن ارجاع می دهند افزایش نمی دهد. init ( نام : رشته ) { خود . نام = نام } deinit { print ( "Deinitialized \( name ) " ) }}کلاس خانه { let address : String صاحب var : شخص ؟ init ( آدرس : رشته ، مالک : شخص ؟) { خود . آدرس = آدرس خود . مالک = مالک } deinit { print ( "Deinitialized \( address ) " ) }}var stacy : شخص ؟ = شخص ( نام : "استیسی" )var house21b : خانه ? = خانه ( آدرس : "21b Baker Street" ، مالک : stacy )استیسی ؟ home = house21b // stacy و house42b اکنون به یکدیگر مراجعه می کنند.stacy = صفر // تعداد مرجع برای stacy اکنون 1 است، زیرا house21b هنوز یک مرجع به آن دارد.house21b = صفر // تعداد مرجع house21b به 0 کاهش می یابد، که به نوبه خود تعداد stacy را به 0 کاهش می دهد زیرا house21b آخرین نمونه ای بود که ارجاع قوی به stacy داشت.// چاپ:// 21b خیابان بیکر از مقدار اولیه خارج شد// استیسی را از مقدار اولیه خارج کرد
یکی از عناصر کلیدی سیستم سوئیفت، توانایی آن در اشکال زدایی تمیز و اجرا در محیط توسعه، با استفاده از حلقه خواندن-ارزیابی-چاپ (REPL) است که به آن ویژگی های تعاملی بیشتر از برنامه نویسی سیستمی سنتی با توانایی های اسکریپت نویسی پایتون مشترک است. زبان ها REPL با زمینهای بازی ، نماهای تعاملی که در محیط Xcode یا برنامه Playgrounds اجرا میشوند که به تغییرات کد یا اشکالزدا در لحظه پاسخ میدهند، بیشتر میشود. [102] زمین های بازی به برنامه نویسان اجازه می دهد تا کد سوئیفت را به همراه اسناد علامت گذاری اضافه کنند. برنامه نویسان می توانند با استفاده از LLDB یا در یک کنسول یا یک IDE مانند Xcode ، از کد عبور کرده و نقاط شکست را اضافه کنند .
سوئیفت یک زبان برنامه نویسی خانواده C در نظر گرفته می شود و از جهات مختلف شبیه به C است:
+
رفتار کمی متفاوت هستند. به عنوان مثال، در Swift، +
روی سرریز تله می اندازد، در حالی که &+
برای نشان دادن رفتار C مانند پیچیدن در سرریز استفاده می شود.===
برای بررسی اینکه آیا دو عنصر داده به یک شی اشاره دارند، ارائه می شود .while
، if
و switch
مشابه هستند، اما دارای توابع گسترده هستند، به عنوان مثال، a switch
که موارد غیر صحیح را می گیرد، while
و if
پشتیبانی از تطبیق الگو و باز کردن شرطی اختیاری، از نحو for
استفاده می کند .for i in 1...10
همچنین شباهت هایی به Objective-C دارد:
Int, UInt, Float, Double
self
در متدهای کلاس کلاسی است که متد فراخوانی شده است.for
... in
نحو شمارش.تفاوتهای Objective-C عبارتند از:
;
) ختم شوند، اگرچه این دستورات باید برای اجازه دادن بیش از یک عبارت در یک خط استفاده شوند.i = 0
به جای i == 0
(که خطای زمان کامپایل را ایجاد می کند) جلوگیری می کند.break
از دستورات در switch
بلوک ها نیست. موارد منفرد به مورد بعدی نمیافتند مگر اینکه از fallthrough
عبارت استفاده شود.&+
،،، و . ویژگیها و در سوئیفت برای همه انواع اعداد صحیح تعریف شدهاند و میتوان از آنها برای بررسی ایمن سرریزهای احتمالی، در مقابل تکیه بر ثابتهای تعریفشده برای هر نوع در کتابخانههای خارجی استفاده کرد.&-
&*
&/
&%
min
max
if
و while
که امکان حذف پرانتزهای اطراف عبارت را فراهم می کند، پشتیبانی نمی شود.for (int i = 0; i < c; i++)
، که مستعد خطاهای یک به یک است ، پشتیبانی نمی شود (از سویفت 3 به بعد). [104]i++
, --i
...) پشتیبانی نمی شوند (از سویفت 3 به بعد)، بیشتر از این که for
عبارات سبک C نیز از سویفت 3 به بعد پشتیبانی نمی شوند. [105]از آنجایی که Swift می تواند روی لینوکس اجرا شود، گاهی اوقات به عنوان یک زبان سمت سرور نیز استفاده می شود. [106] برخی از چارچوبهای وب قبلاً توسعه یافتهاند، مانند Kitura از IBM (اکنون متوقف شده است)، Perfect و Vapor .
یک گروه کاری رسمی "Server APIs" نیز توسط اپل راه اندازی شده است، [107] که اعضای جامعه توسعه دهندگان سوئیفت نقش اصلی را ایفا می کنند. [108]
دومین اجرای رایگان Swift که کاکائو ، زیرساخت زبان مشترک مایکروسافت ( .NET Framework ، اکنون دات نت ) را هدف قرار می دهد و پلتفرم جاوا و اندروید به عنوان بخشی از کامپایلر Elements از نرم افزار RemObjects وجود دارد . [109]
زیرمجموعههای Swift به پلتفرمهای اضافی مانند Arduino [110] و Mac OS 9 منتقل شدهاند . [111]
{{cite web}}
: وجود ندارد یا خالی |title=
( راهنما )Swift اختصاصی و بسته است: کاملاً توسط اپل کنترل می شود و هیچ پیاده سازی منبع باز وجود ندارد.
میتوانید تصور کنید که بسیاری از ما میخواهیم منبع باز و بخشی از LLVM باشد، اما بحث هنوز اتفاق نیفتاده است و برای مدتی هم نخواهد شد.
زبان سوئیفت محصول تلاش خستگیناپذیر تیمی از متخصصان زبان، متخصصان مستندسازی، نینجاهای بهینهسازی کامپایلر و یک گروه آزمایشی داخلی فوقالعاده مهم است که برای کمک به اصلاح و آزمایش ایدهها بازخورد ارائه میکنند. البته، از تجربیاتی که بسیاری از زبانهای دیگر در این زمینه به سختی به دست آوردهاند، بسیار سود برده است، ایدههایی از Objective-C، Rust، Haskell، Ruby، Python، C#، CLU، و بسیاری دیگر که نمیتوان فهرست کرد.
من کار روی زبان برنامه نویسی سوئیفت را در جولای 2010 شروع کردم. بسیاری از ساختار اصلی زبان را پیاده سازی کردم، تنها تعداد کمی از افراد از وجود آن اطلاع داشتند. چند نفر دیگر (شگفتانگیز) در اواخر سال 2011 شروع به مشارکت جدی کردند و در جولای 2013 به تمرکز اصلی گروه ابزار توسعهدهنده اپل تبدیل شد [...] ایدههایی از
Objective-C
، Rust، Haskell، Ruby، Python، سی شارپ، CLU و بسیاری دیگر برای فهرست کردن بسیار زیاد است.
{{cite web}}
: |last=
دارای نام عمومی ( راهنما ){{cite web}}
: |last=
دارای نام عمومی ( راهنما )