stringtranslate.com

سوئیفت (زبان برنامه نویسی)

سوئیفت یک زبان برنامه نویسی کامپایل شده چند پارادایم و همه منظوره سطح بالا است که توسط 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:)///**/letvar

اجازه دهید  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 قند نحوی را برای بررسی وجود یک مقدار اختیاری و باز کردن آن در همان زمان فراهم می کند.ififelseif-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]fileprivateinternalpublicopen

اختیاری و زنجیر

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

انواع اختیاری با Optionalenum ایجاد می شوند. برای ساختن یک عدد صحیح که باطل باشد، باید از یک اعلان مشابه استفاده کرد 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 است:

همچنین شباهت هایی به Objective-C دارد:

تفاوت‌های Objective-C عبارتند از:

توسعه و سایر اجراها

از آنجایی که Swift می تواند روی لینوکس اجرا شود، گاهی اوقات به عنوان یک زبان سمت سرور نیز استفاده می شود. [106] برخی از چارچوب‌های وب قبلاً توسعه یافته‌اند، مانند Kitura از IBM (اکنون متوقف شده است)، Perfect و Vapor .

یک گروه کاری رسمی "Server APIs" نیز توسط اپل راه اندازی شده است، [107] که اعضای جامعه توسعه دهندگان سوئیفت نقش اصلی را ایفا می کنند. [108]

دومین اجرای رایگان Swift که کاکائو ، زیرساخت زبان مشترک مایکروسافت ( .NET Framework ، اکنون دات نت ) را هدف قرار می دهد و پلتفرم جاوا و اندروید به عنوان بخشی از کامپایلر Elements از نرم افزار RemObjects وجود دارد . [109]

زیرمجموعه‌های Swift به پلتفرم‌های اضافی مانند Arduino [110] و Mac OS 9 منتقل شده‌اند . [111]

همچنین ببینید

مراجع

  1. ^ ثبت اختراع ایالات متحده شماره. 9329844
  2. «سوئیفت به 1.0 رسیده است». اپل. 9 سپتامبر 2014 . بازبینی شده در ۸ مارس ۲۰۱۵ .
  3. ^ . 27 سپتامبر 2024 https://github.com/swiftlang/swift/releases/tag/swift-6.0.1-RELEASE. {{cite web}}: وجود ندارد یا خالی |title=( راهنما )
  4. «سوئیفت، عینی». Swift اختصاصی و بسته است: کاملاً توسط اپل کنترل می شود و هیچ پیاده سازی منبع باز وجود ندارد.
  5. لاتنر، کریس (11 ژوئن 2014). "Re: [LLVMdev] [cfe-dev] [تبلیغ] موقعیت‌های باز در تیم کامپایلر سوئیفت اپل". بایگانی شده از نسخه اصلی در 14 ژوئیه 2014 . بازبینی شده در 12 ژوئن 2014 . می‌توانید تصور کنید که بسیاری از ما می‌خواهیم منبع باز و بخشی از LLVM باشد، اما بحث هنوز اتفاق نیفتاده است و برای مدتی هم نخواهد شد.
  6. «صفحه اصلی کریس لاتنر». کریس لاتنر. 3 ژوئن 2014 . بازبینی شده در 3 ژوئن 2014 . زبان سوئیفت محصول تلاش خستگی‌ناپذیر تیمی از متخصصان زبان، متخصصان مستندسازی، نینجاهای بهینه‌سازی کامپایلر و یک گروه آزمایشی داخلی فوق‌العاده مهم است که برای کمک به اصلاح و آزمایش ایده‌ها بازخورد ارائه می‌کنند. البته، از تجربیاتی که بسیاری از زبان‌های دیگر در این زمینه به سختی به دست آورده‌اند، بسیار سود برده است، ایده‌هایی از Objective-C، Rust، Haskell، Ruby، Python، C#، CLU، و بسیاری دیگر که نمی‌توان فهرست کرد.
  7. ^ ab Lattner، Chris (3 ژوئن 2014). "صفحه اصلی کریس لاتنر". کریس لاتنر . بازبینی شده در 3 ژوئن 2014 . من کار روی زبان برنامه نویسی سوئیفت را در جولای 2010 شروع کردم. بسیاری از ساختار اصلی زبان را پیاده سازی کردم، تنها تعداد کمی از افراد از وجود آن اطلاع داشتند. چند نفر دیگر (شگفت‌انگیز) در اواخر سال 2011 شروع به مشارکت جدی کردند و در جولای 2013 به تمرکز اصلی گروه ابزار توسعه‌دهنده اپل تبدیل شد [...] ایده‌هایی از Objective-C ، Rust، Haskell، Ruby، Python، سی شارپ، CLU و بسیاری دیگر برای فهرست کردن بسیار زیاد است.
  8. ^ "Building assert() در Swift، Part 2: __FILE__ and __LINE__" . بازبینی شده در 25 سپتامبر 2014 .
  9. «تأثیرها - مرجع زنگ». doc.rust-lang.org . بازبینی شده در 2 مه 2020 .
  10. ^ "تأثیر از - مستندات V". github.com ​بازبینی شده در 3 نوامبر 2023 .
  11. لاردینویز، فردریک (۲ ژوئن ۲۰۱۴). اپل سوئیفت را راه اندازی کرد، زبان برنامه نویسی جدید برای نوشتن برنامه های iOS و OS X. TechCrunch . بازبینی شده در 7 سپتامبر 2022 .
  12. ^ برنامه نویسی پروتکل گرا در سوئیفت. شرکت اپل یوتیوب .
  13. «مفاهیم شبیه به ویژگی های زنگ زدگی هستند».
  14. ویلیامز، اوون (۲ ژوئن ۲۰۱۴). شصتمین سالگرد تولد تیم برنرز لی، اپل زبان برنامه نویسی جدید Swift را برای iOS معرفی کرد. وب بعدی بازبینی شده در 2 ژوئن 2014 .
  15. "زبان برنامه نویسی جدید اپل سوئیفت اکنون منبع باز است". آستانه . 3 دسامبر 2015 . بازبینی شده در 5 دسامبر 2015 .
  16. «Swift Sources Open Apple in Latest Pitch to the Enterprise» . مجله CIO. وبلاگ های وال استریت ژورنال 3 دسامبر 2015 . بازبینی شده در 5 دسامبر 2015 .
  17. «نگاهی به سوئیفت 3 و پیش رو به سویفت 4». انجمن های سوئیفت . 29 جولای 2016 . بازبینی شده در 19 نوامبر 2018 .
  18. «Swift-Evolution». Swift Evolution . بازبینی شده در 19 نوامبر 2018 .
  19. «رتبه‌بندی زبان برنامه‌نویسی RedMonk: ژانویه 2018 – tecosystems». redmonk.com ​7 مارس 2018 . بازبینی شده در 20 نوامبر 2018 .
  20. کرمنک، تد (25 مارس 2019). "سوئیفت 5 منتشر شد!".
  21. کرمنک، تد (۲۰ سپتامبر ۲۰۱۹). "سوئیفت 5.1 منتشر شد!". بایگانی‌شده از نسخه اصلی در ۲۶ فوریه ۲۰۲۲ . بازبینی شده در 28 اکتبر 2019 .
  22. هادسون، پل (6 ژوئن 2021). "چه چیزی در سوئیفت 5.5 جدید است؟". HackingWithSwift.com . هک کردن با سوئیفت بازبینی شده در 8 ژوئن 2021 .
  23. «سوئیفت 5.9 منتشر شد». Swift.org ​18 سپتامبر 2023 . بازبینی شده در 9 اکتبر 2023 .
  24. ^ ab Borla, Holly (5 مارس 2024). "سوئیفت 5.10 منتشر شد". Swift.org ​بازبینی شده در 13 مارس 2024 .
  25. «Swift.org». Swift.org ​مارس 2014 . بازبینی شده در 28 آوریل 2024 .
  26. ^ Inc, Apple (17 سپتامبر 2024). "اعلام سوئیفت 6". Swift.org ​بازبینی شده در 15 اکتبر 2024 . {{cite web}}: |last=دارای نام عمومی ( راهنما )
  27. ^ ab Platforms State of Union، جلسه 102، کنفرانس جهانی توسعه دهندگان اپل ، 2 ژوئن 2014
  28. ^ زبان برنامه نویسی سویفت. اپل . 2 ژوئن 2014 . بازبینی شده در 2 ژوئن 2014 .
    • "اسناد". سویفت .
  29. «سوئیفت به 1.0 رسیده است». 9 سپتامبر 2014 . بازبینی شده در 10 سپتامبر 2014 .
  30. «یادداشت‌های انتشار Xcode 6.1». 22 اکتبر 2014 . بازبینی شده در 23 ژانویه 2015 .
  31. «یادداشت‌های انتشار Xcode 6.3». 8 آوریل 2015 . بازبینی شده در ۸ آوریل ۲۰۱۵ .
  32. «Swift 2 Apps in App Store». وبلاگ سویفت بازبینی شده در 13 مارس 2016 .
  33. "سوئیفت 3.0 منتشر شد!". Swift.org ​13 سپتامبر 2016. بایگانی شده از نسخه اصلی در 14 اکتبر 2016 . بازبینی شده در 26 اکتبر 2016 .
  34. «سوئیفت 4.0 منتشر شد!». Swift.org ​17 سپتامبر 2017. بایگانی شده از نسخه اصلی در 28 مارس 2019 . بازیابی شده در 1 مارس 2018 .
  35. "سوئیفت 4.1 منتشر شد!". Swift.org ​29 مارس 2018. بایگانی شده از نسخه اصلی در 25 آوریل 2019 . بازیابی شده در 30 مارس 2018 .
  36. «Stack Overflow Developer Survey Results 2015».
  37. «Stack Overflow Developer Survey Results 2016».
  38. «Swift.org و منبع باز». Swift.org ​شرکت اپل بازبینی شده در 25 فوریه 2019 .
  39. «معرفی IBM Swift Sandbox — Swift». سویفت . بازبینی شده در 5 دسامبر 2015 .
  40. مایو، بنجامین (4 دسامبر 2015). "نوشتن کد Swift در یک مرورگر وب با IBM Swift Sandbox". 9to5Mac . بازبینی شده در 5 دسامبر 2015 .
  41. «بعد از اینکه اپل منبع باز کرد، IBM برنامه نویسی سوئیفت را در فضای ابری قرار داد». ZDNet . بازبینی شده در 5 دسامبر 2015 .
  42. «کاتالوگ بسته Swift و منسوخ شدن Swift Sandbox» . بازبینی شده در 9 نوامبر 2018 .
  43. «زمین های بازی سوئیفت». توسعه دهنده اپل . بازبینی شده در 19 ژوئن 2016 .
  44. «Swift Playgrounds — Preview». اپل . بازبینی شده در 19 ژوئن 2016 .
  45. مایو، بنجامین (۱۳ ژوئن ۲۰۱۶). اپل Swift Playgrounds را برای iPad در WWDC معرفی کرد که در پاییز منتشر خواهد شد. 9to5Mac . بازبینی شده در 19 ژوئن 2016 .
  46. کانینگهام، اندرو (۱۰ ژانویه ۲۰۱۷). برنامه نویس قدیمی اپل و خالق سوئیفت اپل را به مقصد تسلا ترک می کند. Ars Technica.
  47. وورتل، مایک (۱۳ ژانویه ۲۰۱۷). "تد کرمنک، رئیس پروژه جدید سوئیفت، گفته است که این سریال را برای مدتی پشت صحنه اجرا خواهد کرد." AppleInsider.
  48. دنیل اران دیلگر (۱۹ ژوئن ۲۰۱۹). WWDC19: SwiftUI درخشان‌ترین ستاره در کهکشان ایده‌های جدید بود. AppleInsider . بازبینی شده در 19 جولای 2019 .
  49. "Swift.org - دانلود سوئیفت" . بازبینی شده در 21 ژوئن 2020 .
  50. «Android SDKs for Swift». GitHub . بازیابی شده در 10 سپتامبر 2021 .
  51. «نسخه‌های بسته سریع زبان» . بازیابی شده در 10 سپتامبر 2021 .
  52. ^ ریدل (15 ژانویه 2020). "سوئیفت برای اندروید: تجربه و ابزار ما". متوسط ​بازبینی شده در 20 اوت 2020 .
  53. اندرسون، تیم (30 مارس 2020). "پشتیبانی رسمی سفارشی Swift برای Windows در نسخه 5.3 وعده داده شده است: Swift در پلتفرم های بیشتر - به شرطی که نیازی به رابط کاربری گرافیکی نداشته باشید". ثبت نام . بازبینی شده در 18 سپتامبر 2020 .
  54. «درگاه سوئیفت لینوکس». Swift.org ​شرکت اپل 3 دسامبر 2015 . بازبینی شده در 3 آگوست 2016 .
  55. تایمر، جان (5 ژوئن 2014). "نگاهی سریع به سوئیفت، زبان برنامه نویسی جدید اپل". Ars Technica . Condé Nast . بازبینی شده در 6 ژوئن 2014 .
  56. کرمنک، تد (25 مارس 2019). "سوئیفت 5 منتشر شد!". Swift.org ​بازبینی شده در 28 مارس 2019 .
  57. «دانلود سوئیفت». Swift.org ​اپل . بازبینی شده در 15 دسامبر 2020 .
  58. کرمنک، تد (26 آوریل 2021). "سوئیفت 5.4 منتشر شد!". Swift.org ​اپل. بایگانی‌شده از نسخه اصلی در ۲۶ آوریل ۲۰۲۱ . بازبینی شده در 26 آوریل 2021 .
  59. کرمنک، تد (14 مارس 2022). "سوئیفت 5.6 منتشر شد!". Swift.org ​اپل . بازبینی شده در 14 مارس 2022 .
  60. «Release Swift 5.6.1 Release · apple/Swift». GitHub .
  61. «Release Swift 5.6.2 Release · apple/Swift». GitHub .
  62. «Release Swift 5.6.3 Release · apple/Swift». GitHub .
  63. بورلا، هالی (۱۲ سپتامبر ۲۰۲۲). "سوئیفت 5.7 منتشر شد!". Swift.org ​اپل . بازبینی شده در 23 سپتامبر 2022 .
  64. «Release Swift 5.7.1 Release · apple/Swift». GitHub .
  65. «Release Swift 5.8 Release · apple/Swift». GitHub .
  66. «Release Swift 5.8.1 Release · apple/swift». GitHub . بازبینی شده در 14 ژوئن 2023 .
  67. «Release Swift 5.9 Release · apple/swift». GitHub . بازبینی شده در 18 سپتامبر 2023 .
  68. «Release Swift 5.9.1 Release · apple/swift». GitHub . بازبینی شده در 19 اکتبر 2023 .
  69. «Release Swift 5.9.2 Release · apple/swift». GitHub . بازبینی شده در 11 دسامبر 2023 .
  70. «Swift 5.10.1 Release». GitHub . بازبینی شده در 5 ژوئن 2024 .
  71. «Swift 6.0 Release». GitHub . بازبینی شده در 17 سپتامبر 2024 .
  72. «مستندات». docs.swift.org ​بازبینی شده در 17 نوامبر 2023 .
  73. ^ "حذف مسابقه داده با استفاده از همزمانی سوئیفت - WWDC22 - ویدئوها". شرکت اپل بازبینی شده در 17 نوامبر 2023 .
  74. ^ ab "مستندات". docs.swift.org ​بازبینی شده در 15 اکتبر 2023 .
  75. «مستندات». docs.swift.org ​بازبینی شده در 15 اکتبر 2023 .
  76. «Closures — The Swift Programming Language (Swift 5.5)». docs.swift.org ​بازبینی شده در 31 اوت 2021 .
  77. ^ مکومبر، کایل؛ یاسکویچ، یاول؛ گرگور، داگ؛ مک کال، جان. "بستن های چندگانه دنباله دار". GitHub . بازبینی شده در 19 اکتبر 2020 .
  78. «مستندات». docs.swift.org ​بازبینی شده در 16 اکتبر 2023 .
  79. «رشته‌ها و شخصیت‌ها». docs.swift.org ​بازبینی شده در 16 اکتبر 2023 .
  80. «اعلامیه ها - زبان برنامه نویسی سوئیفت (Swift 5.6)». docs.swift.org ​بازبینی شده در 28 فوریه 2022 .
  81. «کنترل دسترسی». زبان برنامه نویسی سویفت توسعه دهنده اپل . بازبینی شده در ۲۵ اکتبر ۲۰۱۶ .
  82. «انواع پوچ»، راهنمای برنامه نویسی سی شارپ، مایکروسافت. بایگانی‌شده در 21 فوریه 2017، در Wayback Machine .
  83. «انواع». زبان برنامه نویسی سویفت توسعه دهنده اپل . بازبینی شده در 16 جولای 2014 .
  84. ^ ab "کلاس ها و ساختارها". زبان برنامه نویسی سویفت توسعه دهنده اپل. بایگانی شده از نسخه اصلی در ۲۵ مارس ۲۰۱۶.
  85. Guhit, Fiel (14 فوریه 2015). "مطالعه موردی عملکرد در سوئیفت 1.1، سوئیفت 1.2 و هدف-C". متوسط ​بایگانی‌شده از نسخه اصلی در ۱۲ دسامبر ۲۰۲۳.
  86. ^ ساخت برنامه های بهتر با انواع ارزش. اپل. بایگانی شده از نسخه اصلی در 21 ژوئن 2015.
  87. «برنامه های افزودنی». docs.swift.org ​بازبینی شده در 28 نوامبر 2023 .
  88. «کار با پروتکل ها». برنامه نویسی با Objective-C . آرشیو اسناد توسعه دهنده اپل. 17 سپتامبر 2014. بایگانی شده از نسخه اصلی در 29 آوریل 2016.
  89. «مرجع پروتکل NSCopying». اپل .
  90. «آمار کتابخانه استاندارد سوئیفت». swiftinit.org . سویفتینیت ​بازبینی شده در 2 اکتبر 2023 .
  91. تامپسون، مت (۲ سپتامبر ۲۰۱۴). "پیاده سازی پروتکل پیش فرض سوئیفت". NSHipster .
  92. "swift-evolution/proposals/0304-structured-concurrency.md at main · apple/swift-evolution". GitHub . بازبینی شده در 16 اکتبر 2023 .
  93. "swift-evolution/proposals/0296-async-await.md at main · apple/swift-evolution". GitHub . بازبینی شده در 16 اکتبر 2023 .
  94. «آیا برنامه‌های مبتنی بر سوئیفت روی macOS 10.9/iOS 7 و نسخه‌های پایین‌تر کار می‌کنند؟»، StackOverflow
  95. ^ Inc, Apple (18 سپتامبر 2023). "سوئیفت 5.9 منتشر شد". Swift.org ​بازبینی شده در 9 اکتبر 2023 . {{cite web}}: |last=دارای نام عمومی ( راهنما )
  96. «Writing Classes Swift with Objective-C Behavior»، Apple Inc.
  97. «انتقال کد Objective-C به سویفت».
  98. «Swift and Objective-C in the Same Project»، Apple Inc.
  99. «Apple: «corelib» را جستجو کنید. GitHub .
  100. «Xcode - SwiftUI- Apple Developer». developer.apple.com . بازیابی شده در 1 فوریه 2021 .
  101. ^ لانیر، برایان؛ گراف، جو. "سوئیفت متوسط". اپل . بازبینی شده در 3 جولای 2014 .
  102. ^ متز، کید. "چرا کدنویس ها از زبان برنامه نویسی جدید اپل عصبانی می شوند". سیمی . بازبینی شده در 16 جولای 2014 .
  103. «Error-Handling in Swift-Language». stackoverflow.com .
  104. «apple/swift-evolution». GitHub . بازبینی شده در ۴ آوریل ۲۰۱۶ .
  105. «apple/swift-evolution». GitHub . بازبینی شده در ۴ آوریل ۲۰۱۶ .
  106. باربوسا، گرگ (۲۲ فوریه ۲۰۱۶). آی‌بی‌ام سوئیفت را به فضای ابری می‌آورد و فریمورک وب Kitura را که به زبان برنامه‌نویسی اپل نوشته شده است، منتشر می‌کند. 9to5Mac . بازبینی شده در 16 مه 2016 .
  107. «گروه کاری سرورهای API». Swift.org ​25 اکتبر 2016 . بازبینی شده در 28 اکتبر 2016 .
  108. «Swift.org». Swift.org ​بایگانی شده از نسخه اصلی در 10 مه 2021 . بازبینی شده در 28 اکتبر 2016 .
  109. «کامپایلر عناصر RemObjects» . بازبینی شده در 17 ژانویه 2016 .
  110. «سوئیفت برای آردوینو».
  111. رز، اردن (1 آوریل 2020). "سوئیفت در سیستم عامل مک 9". -dealloc .

لینک های خارجی