<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های هادی شرقی</title>
        <link>https://virgool.io/feed/@hsharghi</link>
        <description>Back-end / iOS Developer</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:59:04</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/20289/avatar/avatar.png?height=120&amp;width=120</url>
            <title>هادی شرقی</title>
            <link>https://virgool.io/@hsharghi</link>
        </image>

                    <item>
                <title>ساخت API وبلاگ با فریمورک Swift Vapor 3 (قسمت اول)</title>
                <link>https://virgool.io/@hsharghi/%D8%B3%D8%A7%D8%AE%D8%AA-api-%D9%88%D8%A8%D9%84%D8%A7%DA%AF-%D8%A8%D8%A7-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-swift-vapor-3-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-jwzlllqbcvaw</link>
                <description>ساخت API وبلاگ با فریمورک Swift Vapor 3 از پست قبلی که نوشتن برنامه Hello World با Vapor بود مدت زیادی گذشت. راستش قرار نبود اینقدر فاصله پست‌ها زیاد باشن اما دلیلش این بود که، منتظر بودم تا ورژن ۴ فریمورک Vapor منتشر بشه و مطالب آموزشی رو با اون بنویسم، چون خیلی خیلی کاملتر و در یک قسمت‌هایی استفاده ازش آسان‌تر هم هست. ولی ظاهرا طبق گفته یکی از دست‌اندرکاران پروژه تا چند ماه دیگه خبری از انتشار ورژن ۴ نیست. پس فعلا با Vapor 3 در خدمت‌تون هستم :)برای درک بهتر مطالب این سری نوشته ها بهتر است آشنایی کافی با زبان Swift بخصوص Generics و Closure و همچنین آشنایی اولیه با RESTful API داشته باشین.یک مفهوم جدید (EventLoopFuture یا Future)از اونجایی که Vapor یک فریمورک Async و Non-blocking هست (برای آشنایی مختصر با Non-blocking و Async به این نوشته من مراجعه کنید) هیچ دستوری باعث توقف مراحل اجرای برنامه نمیشه و به سرعت از روی اون دستور عبور کرده و دستور بعدی اجرا میشه. اما اگر واقعا زمان اجرای تابعی طولانی بود (مثلا خواندن از روی دیتابیس) چه اتفاقی میافته؟ در این صورت چنین تابعی نمیتونه بلافاصله جواب نهایی رو که به فرض یک array از رکوردهای دیتابیس هست رو برگردونه، از طرفی برنامه هم صبر نمیکنه تا اطلاعات از طرف دیتابیس خوانده و فرستاده بشن. پس خروجی تابع در آینده یک array خواهد بود و فعلا یک قول (Promise) داده میشه که بعدا (پس از خوانده شدن موفق اطلاعات از دیتابیس) یک array تحویل داده بشه. به این نوع خروجی EventLoopFuture یا در Vapor به اختصار Future گفته میشه (در واقع Future یک type alias است که Vapor به جای EventLoopFuture استفاده میکند و هیچ فرقی ندارد).اگر فرض کنیم تابع getPostsFromDatabase قرار باشه لیست پست‌های وبلاگ رو به صورت [Post] برگردونه، بعد از صدا زدن این تابع مقدار متغیر posts از نوع EventLoopFuture خواهد بود نه خود [Post]let posts = getPostsFromDatabase()

// posts : EventLoopFuture&lt;[Post]&gt;
مقدار این متغییر در واقع یک array نیست و هیچ کدام از دستوراتی که روی array ها اجرا میشوند، بر روی این متغییر اجرا نخواهند شد. خوب حالا چطوری میتونیم این مغییر رو به array تبدیل کنیم و مثلا اولین المان اون رو بگیریم و در کنسول پرینتش کنیم یا روی تمامی اعضای اون array لوپ بزنیم؟دستورات map و flatMapمیشه Future رو  مانند یک متغیر optional در نظر بگیریم که قبل از استفاده از اون باید حتما unwrap بشه. در حال حاضر تنها راه unwrap کردن یک EventLoopFuture استفاده از این دو دستور بالا است. (تا وقتی که امکان async/await به زبان Swift اضافه بشه، که احتمالا در ورژن 6 خواهد بود ?). به عنوان مثال در تابع قبلی به این صورت میتونیم توی همه Post ها لوپ بزنیم و title هر پست رو چاپ کنیم. https://gist.github.com/hsharghi/b88377c04bf9742d95fcf087c7be8410 اگر داخل map قرار بود دوباره تابعی صدا زده بشه که باز هم جواب آن EventLoopFuture هست، مثلا میخواهیم برای هر post از دیتابیس کامنت های مربوط به اون پست خوانده بشه (این مثال صرفا برای نمایش استفاده از flatMap هست و به این صورت خواندن از دیتابیس کاملا اشتباه است) و به هر پست اضافه بشه، به جای map از flatMap استفاده میکنیم که بعدا با مثال توضیح داده میشه. https://gist.github.com/hsharghi/516344105ce070dccb56966605557c58 بله! مطلب در ابتدا تا حدودی به نظر پیچیده میاد. اما با چند بار استفاده کاملا به موضوع احاطه پیدا خواهید کرد و به راحتی از این دستورات استفاده میکنین. بذارین کمی از این دستورات در کدها استفاده کنیم تا بهتر متوجه بشیم.شروعساخت پروژهبرنامه Terminal رو باز کرده و دستور زیر را وارد کنید تا پروژه ساخته شده و در Xcode باز شود.vapor new blog-api
cd blog-api
vapor xcode -y
برای اطمینان از صحت کارکرد پروژه ساخته شده، آن را کامپایل کنید. دکمه‌های (CMD + B) را بزنید تا با دیدن پیغام Build successful از این قضیه مطمئن بشیم.ساخت مدل Postفایل جدیدی به نام Post.swift به Xcode در فولدر Sources/App/Models اضافه کنید.مطالب زیر را در فایل وارد کنید. https://gist.github.com/hsharghi/4b04dd98f3075017e643ce5daa5e609e توضیحات قسمت‌های مختلف کد:۱- کتابخانه FluentSQLite برای ساختن مدل هایی هست که به دیتابیس SQLite متصل میشوند.۲- از آنجایی که ORM فریمورک Vapor از دیتابیس های متعدد پشتیبانی میکند و در آن واحد در یک پروژه میشود با چند دیتابیس اتصال برقرار کرد، باید در زمان ساخت مدل مشخص کنیم که این مدل از چه نوع دیتابیسی استفاده میکند.۳- فعلا مدل Post را به ساده ترین حالت تعریف میکنیم. کلاس Post سه پارامتر یا property داره که id یا شناسه یکتا در دیتابیس که از نوع Int است. title یا عنوان و body یا متن که هر دو از نوع String تعریف شده اند. دلیل اینکه id به صورت optional تعریف شده اینه که در زمانی که هنوز Post در دیتابیس ذخیره نشده است مقدار id وجود ندارد، پس باید به صورت optional تعریف بشه.۴- به ساده ترین شکل ممکن یک متد initializer برای کلاس تعریف میکنیم.۵- اضافه کردن امکانات از پیش آماده شده به مدل هایی که در Vapor ساخته میشن به صورت extension به کلاس مورد نظر اضافه میشن. وقتی پروتکل (protocol) از قبل تعریف شده Migration رو به کلاس Post اضافه کنیم در واقع اعلام میکنیم که کلاس Post از این پروتکل پیروی میکنه، و باعث میشه که در هنگام شروع برنامه، جدول مربوط به این مدل به طور خودکار در دیتابیس برنامه ساخته بشه (اگر قبلا ساخته نشده باشه). برای مدل های ساده مثل مدل فعلی ما لازم نیست کدی برای Migration بنویسیم و ساخت جدول به صورت خودکار کفایت میکنه. اما اگر مدل پیچیده‌تر باشه میشه در این قسمت کدهای مربوطه رو نوشت.۶- اگر با Codable در Swift آشنایی داشته باشین، میتونم بهتون بگم که Content در واقع همون Codable هست که چند تا پارامتر به خصوصیات اون اضافه شده. برای کسانی که با Codable آشنا نیستن بگم که کلاسی که از پروتکل Codable پیروی میکنه (conform) به راحتی قابل تبدیل شدن از مدل swift به JSON  و بالعکس میباشد. وقتی داریم REST API مینویسیم معلومه که همیشه باید مدل هامون از پروتوکل Content پیروی کنن تا به راحتی تبدیل به JSON و ساخت مدل از روی JSON انجام بشه.۷- وقتی مدل از پروتکل Parameter پیروی کنه، امکان تبدیل خودکار از طریق id مدل، که در url های API فرستاده میشه، به مدل swift رو پیدا میکنه . به این کار Route Model Binding گفته میشه. یعنی اگر چنین آدرسی رو داشته باشیمhttp://my-blog.com/posts/99
هنگامی که این url فرا خونده میشه و متد مربوطه در برنامه ما صدا زده میشه، Vapor به طور خودکار اطلاعات پست با شناسه 99 رو از دیتابیس میخونه، تبدیل به مدل Post میکنه و در اختیار ما قرار میده بدون اینکه ما دستور اضافه ای رو صدا بزنیم.معمولا پیروی مدل‌های Vapor از این ۳ پروتکل برای عمده کارها کفایت میکنه و ما هم فعلا به همین بسنده میکنیم.نوشتن Route های مربوط به Postبرای داشتن یک API کامل (RESTful) برای مدل Post حداقل به ۵ عدد route احتیاج داریم:1- index    برای نمایش لیست پست هاMethod: GET   |    url: /posts2- show   برای نمایش یک پست با شناسه مشخص Method: GET   |    url: /posts/{id}3- create   برای ایجاد پست جدیدMethod: POST   |    url: /posts4- update  برای بروزرسانی پست موجود با شناسه مشخصMethod: PATCH   |    url: /posts/{id}5- delete    برای حذف پست موجود با شناسه مشخصMethod: DELETE   |    url: /posts/{id}فایل routes.swift رو باز کنید و مطالب موجود در اون رو با این مطالب جایگزین کنین. https://gist.github.com/hsharghi/7c05aa9eb47b9ba035f2c75b31c5f9a7 توضیحات قسمت‌های مختلف کد:۱- یک متغیر از روی کلاس PostController ایجاد میکنیم. این کلاس هنوز وجود ندارد و در مرحله بعد اون رو میسازیم برای همین موقتا در Xcdoe  خطا مشاهده خواهید کرد. این کلاس شامل تمام توابعی هست که برای نمایش، ساختن، بروزرسانی و پاک کردن پست‌ها لازم است.۲- روت های لازم که در بالا لیست اونها رو دیدیم تعریف میکنیم. دقت کنید Method هر روت مشخص است (get, post, patch, delete) . تمامی پارامتر های این توابع تا قبل از پارامتر use همگی تشکیل دهنده آدرس route هستند. Vapor این پارامترها را به هم متصل میکند تا آدرس URL مربوط به این تابع ساخته شود. مثلا برای اینکه تابعی داشته باشیم تا هنگام فراخوانی درخواست به آدرس زیر صدا زده بشه، /posts/users/5به این صورت نوشته میشهrouter.get(&amp;quotposts&amp;quot, &amp;quotusers&amp;quot, User.parameter, use: UserController.showUserPosts)مطلب مهم در این قسمت استفاده از parameter. برای  Route Model Binding است. در کد مربوط به روت های Post چندین جا از Post.paramter استفاده شده. از اونجایی که کلاس Post ما از پروتکل Parameter پیروی میکنه میتونیم از این دستور در route ها استفاده کنیم. این دستور باعث میشه id پست مورد نظر که در URL وجود داره، از دیتابیس خوانده بشه و مدل دریافت شده از دیتابیس در اختیار ما گذاشته بشه. پارامتر دوم تابع router، نام یک تابع از کلاس Controller است که هنگام فراخوانی URL مورد نظر ما اجرا میشود.نوشتن توابع و دستورات PostController فایل جدیدی به اسم PostController.swift در دایرکتوری Sources/App/Controllers اضافه کنید و مطالب زیر را در آن وارد کنید. https://gist.github.com/hsharghi/341f666d86b993b10345e32777f4f5c2 توضیحات قسمت‌های مختلف کد:۱- تابع index برای گرفتن لیست پست‌های موجود و دارای کد ساده‌ای است. تنها کاری که انجام میدهد روی مدل Post یک کوئری میزند و لیست همه Postها را برمیگرداند. از آنجایی که کوئری زدن در Vapor یک عمل Async هست و نتیجه آن بعدا (زمانی که سرور دیتابیس جواب کوئری را برگرداند) مشخص میشود، ما در واقع یک array از پست ها - [Post] - رو برنمیگردونیم و داریم یک Future از نوع [Post] برمیگردونیم. که در این قسمت خود Vapor زحمت این کار رو میکشه و هنگامی که Future&lt;[Post]&gt; l به [Post] تبدیل شد (این قضیه بسته به پیچیدگی کوئری و بار سرور دیتابیس، ممکن است از چند هزارم ثانیه تا چندین ثانیه طول بکشد)، آن را تبدیل به JSON کرده (یادتون باشه که مدل Post از پروتکل Content پیروی میکرد) و نتیجه را به ما برمیگرداند.مطلبی که ممکن است توجه شما را جلب کرده باشه اینه که چرا را متغیر req را به تابع query میفرستیم. به اختصار میشه اینطور گفت که چون عملیات Async در پشت صحنه بسیار پیچیده هستند و احتیاج به یک Worker دارند که متغیر req که از نوع Request میباشد در واقع یک نوع Container هست که درون خود یک یا چند Worker دارد. برای همین ما برای اجرای کوئری ها میتونیم با فرستادن req به تابع query نیاز آن به Worker را تامین کنیم.۲- تابع show برای نمایش جزئیات یک پست استفاده میشه. id پست مورد نظر به عنوان پارامتر در URL فرستاده میشه و از انجایی که مدل Post از پروتکل Parameter پیروی میکنه Vapor میتونه id پست را از داخل URL تشخیص بده و پست مورد نظر رو از دیتابیس بگیره و به ما تحویل بده و کماکان چون این کار با کوئری زدن از دیتابیس انجام میشه جوابی که به دست ما میرسه یک Future از نوع Post هست که ما در انتهای تابع show آن را برمیگردانیم و بقیه کارها را Vapor انجام میدهد (تبدیل Future-Post به Post و پس از آن تبدیل Post به JSON)۳- کار تابع create ذخیره کردن یک Post در دیتابیس است که مشخصات آن در واقع در بدنه ریکوئست (body) فرستاده شده اند. مثل title و body. در این مرحله با توجه به پارامترهای مربوط به پست جدید که در بدنه ریکوئست فرستاده شده‌اند یک مدل Post ساخته میشه و اون رو در متغیر post ذخیره میکنیم. ۴- الان میتونیم تابع save را بر روی متغیر post صدا بزنیم و این مدل را در دیتابیس ذخیره کنیم و در انتها همان مدل ذخیره شده را برمیگردانیم.۵- در تابع delete برای حذف یک پست از دیتابیس همانند تابع show باید id آن پست در URL فرستاده شود. از آنجایی که گرفتن آبجکت post مورد نظر از دیتابیس باعث میشود جواب داده شده Future باشد، و ما میخواهیم عمل delete را بر روی آن اعمال کنیم احتیاج به خود مدل Post داریم نه Future-Post، پس از flatMap استفاده میکنیم تا بتونیم به مدل Post دسترسی داشته باشیم۶- تابع delete رو بر روی آبجکت post صدا میزنیم تا آن را از database حذف کند.۷- معمولا جواب ریکوئست DELETE در صورت موفق بودن یک ریسپانز (HTTP Response) با بدنه خالی و با استتوس 204 است که به نام No-content مشهور مبیاشد. جواب تابع delete را با دستور transform به HTTPStatus.noContent تبدیل میکنیم و آن را برمی‌گردانیم.۸- گرفتن پست موجود که id آن در URL آمده است و استفاده از flatMap برای دسترسی به مدل واقعی Post نه Future-Post۹- آپدیت کردن یک مدل کمی متفاوت است. به ۲ دلیل:‌یکی اینکه مشخصاتی که در بدنه ریکوئست میفرستیم تا برنامه آنها را تغییر دهد لزوما همیشه همه مشخصات موجود در یک مدل نیستند. مثلا در مدل پست ممکن است فقط title رو تغییر بدیم و پارامتر body رو تغییر ندیم. پس فقط پارامتر title با مقدار جدید اون فرستاده می‌شود و اگر بخوایم یک مدل پست با پارامترهای فرستاده شده بسازیم پارامتر body مقدار nil خواد داشت که امکانش نیست. چون همونطور که در مدل Post میبینید پارامتر body به صورت optional تعریف نشده اند. یعنی نمیتونه nil باشند. و دلیل بعدی اینه که شاید بعضی مشخصات پس از ثبت دیگر نبایستی تغییر بکنند. به عنوان مثال بعد از گرفتن مشخصات یک کاربر در هنگام ثبت نام، دیگر امکان تغییر کدملی نباید وجود داشته باشد. پس به هنگام بروزرسانی مشخصات کاربر، اصلا نباید اجازه بدیم در مدلی که از روی پارامترهای بدنه ریکوئست ساخته میشه، پارامتر کدملی وجود داشته باشه. برای رفع این موارد، ما یک مدل شبیه مدل Post میسازیم و پارامترهای اون رو همونطور که مد نظر خودمون هست تعریف میکنیم. برای اینکار یک struct جدید به نام UpdatablePost در کلاس Post تعریف میکنیم و هر دو پارامتر title و body آن رو به صورت optional معرفی میکنیم.final class Post: SQLiteModel {....   // existing code  struct UpdatablePost: Content {     var title: String?     var body: String?  }}حالا به جای اینکه بگیم پارامترهای موجود در بدنه ریکوئست رو به مدل Post تبدیل کنه، آنها رو به مدل Post.UpdatablePost تبدیل میکنیم و در متغییر newPostValues ذخیره میکنیم.۱۰- در این قسمت چک میکنیم هر کدام از پارامترهایی که فرستاده شده اند چنانچه مقدار داشتند، مقدار آن را در آبجکت post بروزرسانی میکنیم. هر کدام هم مقداری نداشتند همان مقدار قبلی آن قرارداده میشود. (بدون تغییر می‌ماند)۱۱- تابع update را بر روی post صدا میزنیم تا هر کدام از مقادیر مشخصات آن تغییر کرده بودند در دیتابیس بروزرسانی و ذخیره شوند و در نهایت مدل بروزرسانی شده رو برمیگردانیم. تنظیمات کلی برنامه  قبل از اینکه بتونیم کد مون رو کامپایل و اون رو تست کنیم چند مورد رو باید در فایل تنظیمات (config) تغییر بدیم.فایل configure.swift رو باز کنید و مطالب موجود در اون رو با این مطالب جایگزین کنین. https://gist.github.com/hsharghi/b08598e88a8f71d1c6608afeee85e468 ۱- در این قسمت ما نوع ذخیره اطلاعات در دیتابیس sqlite رو در file انتخاب کرده و آدرس و نام فایل مورد نظرمون رو بهش میدیم. برای انجام تست میشه از حالت ذخیره در memory هم استفاده کرد که دیگه احتیاج به وارد کردن نام فایل نداره و پس از هر بار راه اندازی برنامه دیتابیس موجود در memory پاک میشه.۲- در این قسمت به Vapor میگیم که مدل Post رو به لیست migration ها اضافه کن. هر مدلی که به این لیست اضافه بشه در هنگام راه اندازی برنامه چنانچه تیبل اون در دیتابیس ساخته نشده باشه، Vapor اون تیبل رو در دیتابیس ایجاد میکنه. خوب! الان میتونین برنامه رو اجرا کنین. در Xcode از قسمت Scheme گزینه Run -&gt; My Mac رو انتخاب کنید و دکمه Cmd+R رو بزنین و منتظر باشین تا کامپایل تموم بشه و در کنسول Xcode این عبارت رو ببینین.[ INFO ] Migrating &#039;sqlite&#039; database (.../blog/.build/checkouts/fluent/Sources/Fluent/Migration/MigrationConfig.swift:69)
[ INFO ] Preparing migration &#039;Post&#039; (.../blog/.build/checkouts/fluent/Sources/Fluent/Migration/Migrations.swift:111)
[ INFO ] Migrations complete (.../blog/.build/checkouts/fluent/Sources/Fluent/Migration/MigrationConfig.swift:73)
Running default command: ~/Library/Developer/Xcode/DerivedData/blog-btnxmupvzrtyhxgiuhlrbbibutsv/Build/Products/Debug/Run serve
Server starting on http://localhost:8080الان برنامه شما اجرا شده و روی پورت 8080 منتظر ارسال درخواست های شما هست، میتونین با برنامه REST Client  دلخواه تون مثل Paw یا Postman تمامی قسمت های برنامه رو تست کنین. برای تست‌های خیلی ساده و سریع من برنامه Rested رو پیشنهاد میکنم که به رایگان میتونین از Mac Appstore بگیرن. اما برای کارهای پیچیده‌تر یکی از برنامه‌های Paw و Postman و Insomnia پیشنهاد میشه.ضمنا کد این پروژه تا این مرحله در گیت‌هاب موجوده و میتونین اون رو دانلود کنین.در قسمت های بعد به تعریف کاربر و اتصال پست ها به کاربران و نوشتن نظر برای هر پست میپردازیم.نتیجه کارکرد قسمت‌هایی از برنامه رو در این عکسها میتونین ببینینایجاد یک پست جدیدگرفتن لیست پست های ایجاد شدهتغییر title برای پست شماره 2</description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Sat, 21 Dec 2019 15:58:32 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه Hello World با استفاده از Swift Vapor 3</title>
                <link>https://virgool.io/@hsharghi/hello-world-swift-vapor-%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA-zjtqsdfmcb15</link>
                <description>در این سری مطالب میخوام طریقه نصب، راه اندازی و نوشتن API به زبان Swift توسط فریمورک Vapor رو  نشون بدم. برای استفاده از این مطالب آشنایی کافی با زبان Swift پیش نیاز و ضروری است. مثل همیشه اول برنامه Hello World رو مینویسیم!اصلا چرا با Swift باید API ها مون رو بنویسیم؟ مگر PHP با این همه فریمورک‌های مختلف یا Javascript با چندین فریمورک و صدها هزار پکیج آماده چه مشکلی دارن؟ باید بگم هیچ مشکلی ندارن،خیلی هم خوب هستن! ولی برنامه نویس iOS که با زبان Swift آشنایی داره، اگر بتونه back-end پروژه اش رو با همون زبان بنویسه محاسن متعددی داره. اگر به زبان های معمول که در back-end استفاده میشه تسلط ندارین، برای نوشتن back-end برنامه iOS خودتون لازم نیست زبان جدید رو یاد بگیرین.جابجا شدن بین کد برنامه‌های client و server و تغییر زبان همیشه ناخوشایند بوده.زبان‌های PHP, Python و Javascript (به غیر از TypeScript)  هیچ کدام Type Safe نیستن. یعنی شما میتونین یه متغیر Int داشته باشین امکان اینکه در یک قسمت از کد برنامه به اشتباه یک array رو داخل اون ذخیره کنین همیشه وجود داره، اونم بدون اینکه کسی به شما ایراد بگیره! این موضوع تا یه جایی خیلی جذابه، ولی مشکل وقتی مشاهده میشه که تا وقتی پروژه اجرا نشده (زمان Run time) شما متوجه خطاهای ناشی از این قضیه نمیشین. در Swift هیچوقت امکان نداره به اشتباه این کار انجام بشه. چون کامپایلر قبل از اجرای برنامه به شما خطا میده.میتونین مدل هایی که در سمت اپلیکیشن میسازین، همون ها رو در سمت back-end استفاده کنین. ممکنه در یک پروژه ساده و کوچک موضوع مهمی نباشه ولی وقتی ده‌ها مدل مختلف ساختین و مجبور هستین عینا این مدل ها رو در طرف دیگر پروژه هم بسازین اینکار واقعا خسته کننده میشه و امکان خطا رو هم بالا میبره. اضافه بر این تغییر در هر کدوم از مدل ها باید در هر دو جا انجام بشه.و مهمترین دلیل اینه که Swift زبان جذابی هست!برای شروع کار شما کافیه که برنامه XCode رو بر روی مک خود نصب کنین. ورژن XCode باید 9.3 و به بالا باشه، همچنین ورژن Swift باید 4.1 به بالا باشه. برای چک کردن این موضوع دستور زیر را در Termial وارد کنید.swift --versionApple Swift version 4.1.0 (swiftlang-900.0.69.2 clang-900.0.38)Target: x86_64-apple-macosx10.9دیگه میتونیم Vapor رو نصب کنیم. برای نصب راحت ترین راه استفاده از Homebrew است. اگر هنوز Homebrew رو نصب نکردین این دستور رو در Terminal اجرا کنین و صبر کنین تا نصب تمام بشه./usr/bin/ruby -e &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quot;بعد از نصب Homebrew باید این دستور ها رو اجرا کنین تا Vapor نصب بشه.brew tap vapor/tapbrew install vapor/tap/vaporبرای چک کردن صحت نصب میتونین دستور زیر رو اجرا کنینvapor --versionVapor Toolbox: 3.1.10حالا میریم سراغ ساخت اولین پروژه. دستور زیر رو اجرا کنین تا پروژه ساخته بشه.vapor new hello-worldCloning Template [      •                  ]  (ممکنه تا چند دقیقه فقط این متن رو ببینین! صبر کنین)در این اینجا Vapor داره تمام کتابخانه های لازم برای ساخت پروژه رو دانلود میکنه. برای بار اول اجرای این دستور خیلی طول میکشه. اما بعد از آن دفعات بعدی خیلی سریع تر میشه.منتظر باشین تا این صحنه رو ببینین!وارد دایرکتوری پروژه بشین و دستور زیر رو اجرا کنین تا Vapor toolbox از روی پروژه شما یک پروژه XCode بسازه و بتونین اون رو در XCode باز کرده و شروع به کد نویسی کنیم.cd hello-worldvapor xcode -yبرنامه XCode باز شده و پروژه شما هم بارگذاری شده است. قبل از هر کاری پروژه رو Build کنین. چون برای بار اول این کار خیلی طول میکشه و بهتره زودتر شروع کنین!  دکمه cmd+B رو بزنین و صبر کنین تا کامپایل پروژه تمام بشه.الان میتونین برنامه رو اجرا کنین. از قسمت Scheme گزینه Run -&gt; My Mac رو انتخاب کنید. و Cmd+R رو بزنین.وقتی برنامه اجرا بشه، در قسمت Console عبارت زیر دیده میشه. Server starting on http://localhost:8080الان میتونین آدرس بالا رو در بروزر وارد کنین و نتیجه رو ببینین. البته نتیجه خیلی خارق العاده نیست! فقط یه جمله کوچک که نشون میده همه چی خوب پیش رفته!It works!فایل زیر را در XCode باز کنید.Sources/App/routes.swiftدر این فایل دو route که با متد GET صدا زده میشن تعریف شده است. router.get { req in    return &quot;It works!&quot;}این متد که با فراخوانی آدرس http://localhost:8080 صدا زده میشه، یه string بر میگردونهrouter.get(&quot;hello&quot;) { req in    return &quot;Hello, world!&quot;}متد بعدی با فراخوانی آدرس http://localhost:8080/hello صدا زده میشه، و اون هم یه string بر میگردونه. همونی که قرار بود در آخر این مطلب مشاهده کنیم!Hello, world!</description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Thu, 25 Jul 2019 02:00:08 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی و بررسی Frameworkهای Server-Side Swift (قسمت سوم Vapor)</title>
                <link>https://virgool.io/@hsharghi/swift-serverside-vapor-framework-%D8%B3%D9%88%DB%8C%DB%8C%D9%81%D8%AA-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D9%88%DB%8C%D9%BE%D8%B1-ak0but0512ej</link>
                <description>3- Vaporنوبت به فریمورک مورد علاقه من Vapor میرسه! Vapor یکی دیگر از فریمورک‌های متن باز بر پایه زبان Swift است، که پس از انتشار نسخه ۳ زبان Swift معرفی شد. البته Vapor از بدو معرفی زبان Swift وجود داشته ولی انتشار نسخه 1.0 آن تا اواسط سال ۲۰۱۶ طول کشید. با گذشت کمتر از ۸ ماه نسخه ۲ آن منتشر گردید که Vapor را به فریمورکی قابل استفاده در پروژه های واقعی بدل کرد. پس از معرفی Swift NIO توسط اپل و معرفی Swift 4 ، تیم توسعه دهنده Vapor که درحال نوشتن نسخه 3 و مقدمات انتشار این نسخه بودند، طی حرکتی غیرقابل باور، تمامی کدهای قدیمی را به دور ریخته و کدهای جدید را از ابتدا برپایه Swift NIO بازنویسی کرده و آن را به فریمورکی Non-blocking تبدیل کردند. (اگر نمیدونین که non-blocking چی هست برای آشنایی اجمالی میتونین به یکی از نوشته‌های قبلی من رجوع کنید)فریمورک Vapor در حال حاضر با بیش از ۱۶۰۰۰ هزار ستاره در گیت‌هاب (در زمان انتشار این نوشته)، پرطرفدارترین در جمع فریمورک های مبتنی بر زبان Swift است. تیم توسعه دهنده Vapor واقعا از سرعت بالایی برای هماهنگ کردن کدهای این پروژه با آخرین نسخه های زبان Swift و بهره‌گیری از امکانات جدید آن، برخوردار هستند. به عنوان مثال تنها پس از گذشت ۳ هفته از انتشار Swift NIO توسط اپل، تمامی کدهای پروژه Vapor باز نویسی شد و پروژه بر اساس Swift NIO دوباره نوشته و نسخه 3.0 آن منتشر شد. تیم توسعه دهنده Vapor علاوه بر پروژه اصلی، چند پروژه دیگر نیز در دست اجرا دارند. ۱- پروژه Vapor Cloud که معادل IBM Cloud است (البته با امکانات بسیار کمتر)  و جهت Deploy کردن آسان و سریع پروژه های نوشته شده با Vapor به سرور. درحال حاضر نسخه ۱ آن منتشر شده که هیچ نوع سرویس مجانی ندارد. اما در نسخه ۲ آن (که هنوز منتشر نشده است و در مرحله آلفا است) تا حد مناسبی که برای تست پروژه کفایت میکند، سرویس رایگان وجود دارد. منظور از آسان و سریع بودن آن تا این حد است که تنها باید این دستور یک خطی را تایپ کنید تا پروژه به روی سرور منتقل و آماده به کار شود.~/vapor/hello-world $‍‍‍ cloud deploy --env=staging&gt; Creating deployment [Done]&gt; Building vapor [Done]&gt; Creating container [Done]&gt; Updating replicas [Done]&gt; Deploy successful https://hello-world-staging.vapor.cloudالبته عدم کنترل کامل بر روی تنظیمات و برنامه های سرورهای Vapor Cloud هزینه ای است که برای به دست آوردن این آسانی و سرعت می‌پردازید. اگر میخواهید کاملا بر سرور خود مسلط باشید بهتر از سراغ سرویس دوم این تیم بروید.۲- پروژه Vapor Red که فعلا بر روی سرورهای Digital Ocean کار میکند و  در آینده پشتیبانی از سرورهای آمازون هم به آن اضافه خواهد شد. این پنل، GUI کامل و بسیار مناسبی در اختیار شما میگذارد که نصب و راه اندازی هر گونه برنامه ای یا تنظیمی بر روی سرور‌های خود را به راحتی و بدون دردسر انجام دهید. نصب برنامه‌ها و تنظیمات مختص زبان و محیط Swift  یا Vapor نمیباشد.  Vapor Redمیتوانید به راحتی محیط سرور خود را برای اجرای برنامه های PHP با نسخه دلخواه و دیتابیس سرور دلخواه خودتون راه‌اندازی کنید. ضمنا کار Deploy کردن پروژه های Vapor را نیز به راحتی میتوانید انجام دهید. البته این پروژه متاسفانه هیچگونه سرویس رایگانی ندارد.راه سوم نصب Swift و Vapor بر روی سرور و راه اندازی برنامه توسط خود شما است! که انشالله در پست‌های بعدی به آن میپردازیم.برگردیم به فریمورک Vapor و کتابخانه‌هایی که به صورت پیش فرض آماده استفاده بر روی این فریمورک هستند.کتابخانه های از پیش نوشته شده در این فریمورک :Async / non-blocking IOAuthentication (basic, bearer, JWT, password)Cache: (Redis, in-Memory)Commands / console formatting (For building CLI commands)Content Negotiation: JSON, multipart, and URL-encoded formCrypto (RNG, ciphers, digests, RSA)HTTP Client and Server (HTTP 1.1)Leaf Templating: HTML etcLoggingURL RoutingValidationWebSocket client and serverJobs (Queue system)Sessions (Web, Redis)URL RoutingWebsocketsابزاری که Vapor برای مدیریت پروژه‌ها از طریق CLI در اختیار شما قرار میده (Vapor Toolbox) فعلا بجز چند دستور ساده برای ساختن پروژه جدید، ایجاد پروژه XCode از روی پروژه موجود و Deploy کردن پروژه، امکانات بیشتری در اختیار شما قرار نمیده. اما با استفاده از کتابخانه Command  میتونین خودتون با زبان Swift دستورات CLI جدید بنویسین و در پروژه از آنها استفاده کنید.کتابخانه ORM این فریمورک Fluent نام داره. از لحاظ ارتباط از دیتابیس های معمول بازار به صورت پیش‌فرض پشتیبانی میکنه، بجز MongoDB که برای آن کتابخانه های اشخاص ثالثی برای استفاده وجود دارد.MySQL PostgreSQL SQLite Redis MongoDB (Third party packages) برای تولید محتوای HTML این فریمورک به صورت پیش‌فرض از فرمتی به نام Leaf پشتیبانی میکنه که توسط تیم Vapor ساخته شده است. اما به صورت دلخواه، استفاده از از فرمت‌های معمول دیگر مثل Mustache, Stencile و Markdown کاملا میسر است. دلیل اینکه تیم توسعه دهنده Vapor تصمیم به ایجاد Leaf Template گرفتند این بود که تمامی قالب‌های دیگر به نحوی به زبانی به غیر از Swift وابسته بودند و برای همین Leaf تماما با زبان Swift نوشته شد، و باعث شده برای استفاده از این فریمورک تنها پکیجی که احتیاج دارین نصب کنین، Swift است و بس و بر خلاف فریمورک های دیگه که معولا به زبان C یا زبان‌های دیگری احتیاج دارند. البته این قضیه باعث شده که رندر کردن صفحات وب توسط Leaf کمی کند تر از سایر رقبای خودش انجام بشه که از آنجایی که تفاوت آنچنان زیاد نیست میشه از آن صرف نظر کرد.این مطلب که تیم توسعه دهنده Vapor به سرعت این فریمورک را بروز رسانی میکنند و بلافاصله پس از معرفی نسخه‌های جدید Swift و کتابخانه Swift NIO تغییرات را در فریمورک اعمال میکنند از طرفی جالب و هیجان انگیز است. اما از طرفی باعث میشود که API این فریمورک مرتبا در حال تغییر باشه. البته توسعه دهندگان تیم Vapor تمامی سعی خود رو میکنن که تغییرات حداقل باشه اما برای همگام بودن با آخرین تکنولوژی روز که سرعت پیشرفت آن بسیار زیاد است، گاهی مجبور به ایجاد تغییراتی میشوند که کدهای موجود شما رو نیازمند تغییر اساسی میکنن. به عنوان مثال در حال حاضر Vapor تنها فریمورک Swift است که به سرعت کد خود را منطبق بر نسخه 5.0 Swift کرده است. چنانچه احتیاج به فریمورکی دارین که دارای تغییرات کمتری در طول زمان باشه و مرتبا مجبور به بروزرسانی کدهای خود منطبق بر آخرین نسخه آن نباشید، استفاده از Vapor توصیه نمیشه. بهتره انتخاب دیگری مثل Kitura رو در نظر بگیرین که بسیار با احتیاط و آهسته و البته پیوسته در حال بروزرسانی هست.درحال حاضر نسخه 4 این فریمورک در مرحله توسعه و در فاز آلفا میباشد. در نسخه ۴ شاهد استفاده از کتابخانه Swift NIO 2 که از HTTP2 پیشتیبانی میکند خواهیم بود. همچنین تغییراتی در ساختار کلی فریمورک که نوشتن کدهای پویا (Dynamic) رو راحت تر میسر میکنه.پشتیبانی از این پروژه برای کابران و توسعه دهندگان در حال حاضر به صورت رسمی در کانال Vapor در برنامه Discord انجام میشه. البته به سوالات کاربران در Stackoverflow و  forum.swift.org هم پاسخ داده میشه. کانال رسمی Vapor در Discord با بیش از ۱۰هزار نفر عضو و دسته بندی موضوعی برای مطالب معمولا مشکلات شما رو بدون جواب نمیذاره و از این لحاظ فعال ترین جامعه رو بین فریمورک های Swift داره.نقاط قوتامکان ایجاد دستورات CLI با استفاده از زبان Swift پیشرو در بروز بودن (فریمورک، کتابخانه‌ها و استفاده از امکانات جدید زبان Swift)قالب کد (Syntax) بسیار ساده و شبیه به کدهای معول Swift که در iOS استفاده میشه.استفاده از ساختار Async / Non-blocking در کل فریمورکجامعه (Community) بسیار فعال نقاط ضعفتغییرات زیاد در ساختار و API فریمورک که باعث میشه کدهای پروژه باید مرتبا بروزرسانی شوند.</description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Sat, 15 Jun 2019 01:38:32 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی و بررسی Frameworkهای Server-Side Swift (قسمت دوم Kitura)</title>
                <link>https://virgool.io/@hsharghi/swift-serverside-kitura-framwork-%D8%B3%D9%88%DB%8C%DB%8C%D9%81-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%DA%A9%DB%8C%D8%AA%D9%88%D8%B1%D8%A7-ixwfclnb9o8z</link>
                <description>فریمورک بعدی که به معرفی آن میپردازم Kitura هستIBM Kitura2- Kituraشرکت IBM در سال ۲۰۱۶ فریمورک Kitura را معرفی کرد که درحال حاضر سومین فریمورک پر طرفدار Swift با حدود ۷۰۰۰ ستاره در گیت‌هاب است. بین ۳ شرکت کننده اصلی سوم شده! ;) مهمترین نقطه قوت این فریمورک وجود غولی به نام IBM در کنار آن است. اگر دنبال فریمورکی با پشتیبانی کامل و ۲۴ ساعته هستین IBM این امکان را به شما میدهد و میتونین با خیال راحت توسعه پروژه خود با این فریمورک را شروع کنید و از بر خوردن به مشکل در طول کار ترسی نداشته باشین. از طرفی با استفاده از سرویس IBM Cloud به راحتی میتونین پروژه‌ Kitura ی خودتون رو به سرورهای ابری IBM منتقل کنین و دردسر نصب و راه اندازی روی سرور خودتون رو نداشته باشین. قطعا کسانی که برنامه نویسی Server-side انجام داده اند با مشکلات deploy کردن پروژه خود بر روی سرور آشنا هستند و میدونن که وجود سرویسی که پروژه رو به راحتی و بدون دردسر به سرور منتقل رو راه اندازی کنه نعمت بزرگیه!تعدادی از امکاناتی که IBM Cloud به پروژه های Kitura میده:Health (API)یک API کامل برای بررسی وضعیت برنامه‌های موجود در سرورCloudEnvironmentامکان دسترسی ساده و راحت به Environmental Variables به فرمت JSONSwiftMetricsابزاری برای بررسی و مدیریت وضعیت کارایی برنامه‌های روی سرور که هم به صورت پنل مدیریتی و هم به صورت API در اختیار شما قرار داده میشه.Kitura-OpenAPIبه راحتی API های نوشته شده در Kitura را به فرمت Swagger تبدیل میکندSwiftyRequestکتابخانه HTTP Networking برای فرستادن درخواست ها (Requests) توسط Swiftعلاوه بر آن IBM ابزار جدیدی به نام KituraStudio معرفی کرده است که البته در حال حاضرنسخه بتای آن منتشر شده است. KituraStudio یک IDE کامل برای زبان Swift و استفاده از Kitura است. اگر بر روی لینوکس برنامه نویسی میکنین و به همین دلیل امکان استفاده از XCode رو ندارین حتما از این ابزار استفاده کنین.فریمورک Kitura از نسخه 2.5.0 به بعد، از Swift-NIO استفاده میکنه که البته به صورت دلخواه میتونین استفاده از آن رو در پروژه روشن یا خاموش کنین. (برای آشنایی بیشتر با Swift-NIO). کتابخانه های از پیش نوشته شده در این فریمورک :Credentials (Kitura, HTTP, Facebook, Twitter, Dropbox, GitHub, Google) Template Engine (Mustache, Stencil, Markdown) JSON Encoding/Decoding (via Swift&#x27;s Codable)LoggerJWTCache and CompressionProcess ManagementSessions (Web, Redis)URL RoutingWebsocketsاز لحاظ ارتباط با دیتابیس از اکثر دیتابیس های معمول بازار پشتیبانی میکنه.MySQL PostgreSQL MongoDB SQLite Redis CouchDBکیتورا ابزاری ساده ای برای مدیریت پروژه از طریق Command Line دارد که فعلا بیش از چند دستور ساده ندارد ولی برای ساختن پروژه خالی، کامپایل و deploy کردن به IBM Cloud کفایت میکنه. کتابخانه ORM این فریمورک Kuery نام داره و همین طور که در بالا اشاره شد از تعداد خوبی از دیتابیس ها پشتیبانی میکنه و از تقریبا از تمامی دستورات SQL پشتیبانی میکنه. استفاده از Kuery نیاز شما رو از نوشتن دستورات به صورت Raw SQL Query واقعا بی نیاز میکنه. اگر در هنگام توسعه یک پروژه یا پس از اتمام آن مجبور به تغییر دیتابیس مورد استفاده در پروژه تون شده باشین، میدونین که بزرگترین مشکل شما تغییر تمامی کوئری هایی هست که به صورت Raw نوشته شده باشن و از ORM استفاده نشده باشه. پس وجود یک کتابخانه ORM کامل، فوق العاده بدرد بخوره. برای تولید محتوای HTML کیتورا از فرمت های Mustache, Stencile و Markdown پشتیبانی میکند و خودش اقدام به تولید سیستم Template جدیدی نزده. از اونجایی که این فرمت ها بسیار شناخته شده هستن کار شما برای تولید محتوای HTML ساده است. نقاط قوتمهم ترین نقطه قوت Kitura وجود سرویس IBM Cloud است. وجود اینچنین سرویسی زحمت‌های راه‌اندازی و نگهداری سرور را از روی دوش شما بر میدارد و تمام انرژی تون رو میتونین صرف نوشتن کد‌های اصلی پروژه بکنین. (البته این مورد در ایران خیلی نقطه قوت محسوب نمیشه چون IBM این سرویس‌ها رو به ایران نمیده!)وجود پشتیبانی کامل توسط تیم Kitura و IBM-Swift به صورت ۲۴ ساعته. (با پرداخت هزینه)از انجایی که Kitura توسط IBM توسعه داده شده و مثل بسیاری از پروژه های متن باز مشکل پیدا کردن حامی (Sponsor) رو نداره، آینده روشنی براش پیش بینی میشه. و میتونین با خیال راحت پروژه‌ها تون رو با این فریمورک شروع کنین.نقاط ضعفدر بین تمام فریمورک های Swift ، باید گفت که Kitura کوچکترین Community رو داره. گروه مربوط به این فریمورک در Slack کمتر از ۳۰۰۰ عضو دارد و به همین دلیل سوالهای شما در این گروه ها به سرعت پاسخ داده نخواهد شد. به همین دلیل شروع به کار با کیتورا برای اشخصاصی که امکان پرداخت هزینه پشتیبانی IBM رو ندارن مشکل هست.</description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Thu, 28 Feb 2019 14:30:48 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی و بررسی Frameworkهای Server-Side Swift (قسمت اول)</title>
                <link>https://virgool.io/@hsharghi/swift-serverside-perfect-framwork-%D8%B3%D9%88%DB%8C%DB%8C%D9%81-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D9%BE%D8%B1%D9%81%DA%A9%D8%AA-qfkaxb3enml1</link>
                <description>در مطلب قبل دیدیم که چطور شد که Swift راه خودش رو به سایر سیستم عامل ها باز کرده و به زبانی برای نوشتن کدهای سرور تبدیل شد.در اینجا به بررسی Frameworkهای مختلف این زبان می‌پردازم.Perfect Framework1- Perfectپرفکت (Perfect) قدیمی ترین فریمورک (Framework) بر پایه زبان Swift است. این فریمورک در سال 2015 توسط شرکت کانادایی PerfectySoft معرفی شد. در حال حاضر دومین فریمورک پرطرفدار از لحاظ ستاره‌های Github است (حدود ۱۳۲۰۰ ستاره). پرفکت فریمورکی بسیار قدرتمند، سریع و با امکانات فراوان است.از لحاظ امکانات و کتابخانه ها (Library)، میشه گفت کامل ترین فریمورک از بین همه است. لیست بعضی از امکانات از پیش آماده شده در این فریمورک :Directory and File Management FastCGI, HTTP, HTTP2, HTTPS iOS Notifications JSON Encoding/DecodingMustache SupportProcess ManagementSessionsURL RoutingWebSocketsاز لحاظ ارتباط با دیتابیس هم پرفکت کامل ترین لیست رابط ها را دارد و دست شما رو در انتخاب دیتابیس پروژه تون کاملا باز میذاره. حتی از دیتابیس FIleMaker که صرفا بر روی سیستم عامل macOS استفاده میشه هم پشتیانی میکنه.MySQL PostgreSQL MongoDB SQLite Redis FileMakerمتاسفانه ابزاری برای مدیریت پروژه از طریق Command Line ندارد ولی اپلیکیشنی جهت مدیریت و ایجاد پروژه دارد به نام Perfect Assistant که فعلا فقط بر روی سیستم عامل macOS کار میکند. این برنامه از سیستم Docker استفاده میکنه برای همین وقتی دارین با سیستم مک تون روی یک پروژه کار میکنین میتونین به راحتی پروژه رو برای Linux کامپایل کنین و مطمئن بشین که برنامه تون حتما بر روی Linux هم کار میکنه. کتابخانه ORM این فریمورک به نام StORM بسیار کامل است و از دیتابیس های PostgreSQL, MySQL, CouchDB, Mongo, and SQLite پشتیبانی کامل میکند. این حد از پشتیبانی رو در هیچ کدوم از فریمورک های دیگه نمیبینیم. برای تولید محتوای HTML پرفکت از فرمت های Mustache و Markdown پشتیبانی میکند. این ۲ فرمت از استانداردهای پرطرفدار و معروف هستند و اگر با آنها آشنایی قبلی دارین از بابت یادگیری فرمت جدید، میتونه خیالتون راحت باشه.برای پرفکت مطالب آموزشی فراوانی یافت میشه و مهم تر از همه برنامه های نمونه (Example projects)  زیادی بر روی Github پروژه قرارد داره که از این لحاظ هیچ کم و کاستی احساس نمیکنین. میتونین برنامه ها رو با تغییراتی مختصر، مناسب شرایط پروژه خودتون بکنین و استفاده کنین. داکیومنت این فریمورک کامل و دارای مثال های فراوان است. نقاط قوت امکانات بسیار زیاد نسبت به بقیه فریمورک ها. در هیچ کدام از فریمورک های دیگه این همه امکانات آماده و یکجا رو پیدا نمیکنین. در سایر فریمورک ها خیلی از این امکانات توسط تیم هایی به غیر از توسعه دهندگان اصلی به فریمورک ها اضافه شده (Third party packages) یا اصلا وجود نداره. اما پرفکت یک گروه کامل از کتابخانه های مورد نیاز برای توسعه برنامه ها رو در اختیار شما میذاره. پروژه های نمونه و مثال های زیاد برای تسریع یادگیری. برنامه های آماده در Repository جداگانه ای در Github جمع آوری شده اند و به راحتی به آنها دسترسی پیدا میکنین و با خواندن کد آنها مطالب رو سریعتر و بهتر یاد میگیرین.بسیار سریع. در حال حاضر سریعترین فریمورک در بین تمام فریمورک ها میباشد.نقاط ضعفاولین و مهمترین نقطه ضعف این فریمورک ترکیب (Syntax) بسیار سخت آن است. از اونجایی که سرعت مهمترین گزینه توسعه دهندگان این فریمورک بوده است، برای نتیجه گرفتن در بسیاری از کارها، باید کد زیادی نوشت، اون هم به سخت ترین نحوه! برای همین این فریمورک برای کسانی که آشنایی کامل و در حد پیشرفته با زبان Swift ندارن توصیه نمیشه. ایراد بعدی که به این فریمورک میشه گرفت اینه که از Swift-NIO استفاده نمیکنه. Swift-NIO کتابخانه پرقدرت و Async برای برنامه تحت شبکه است. بعد از اینکه اپل Swift-NIO رو معرفی کرد فریمورک های دیگه شروع به استفاده از اون کردن و کدهای پایه رو دوباره بر پایه NIO نوشتن. ولی پرفکت هنوز از Swift-NIO استفاده نمیکنه و این یعنی این فریمورک Async نیست. به عنوان مثال وقتی درخواستی به سرور میرسه،‌ پرفکت درخواست رو بررسی میکنه و از دیتابیس درخواست گرفتن اطلاعاتی رو میکنه و منتظر میمونه تا جواب از طرف دیتابیس ارسال بشه. کل Thread سرور در این مدت قفل و در اختیارِ همین درخواست است. پس از وصول جواب از طرف دیتابیس، پرفکت پاسخ را آماده میکند و بازگشت میدهد.  اگر فریمورک Async باشه در این مدت که منتظر جواب از طرف دیتابیس است، درخواست های دیگه رو دریافت میکنه، بررسی میکنه، حتی درخواست هایی به دیتابیس ارسال میکنه، و هر وقت جواب درخواست اول از طرف دیتابیس دریافت شد، اون جواب رو بررسی و پاسخ رو آماده میکنه و بازگشت میده. در این حالت وقتی تعداد درخواست های همزمان زیاد باشه، سرعت پاسخگویی سرور بسیار بالاتر از حالت اول میشه.یکی دیگه از ایرادتی که میشه برای این فریمورک گرفت اینه که مطالب و ویدیو های آموزشی آن در سایتهای مختلف پخش هستند و یک مکان واحد برای دسترسی به اونها وجود نداره. </description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Sat, 03 Nov 2018 03:42:13 +0330</pubDate>
            </item>
                    <item>
                <title>زبان Swift برای برنامه نویسی Server-Side</title>
                <link>https://virgool.io/coderlife/server-side-swift-%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA-%D8%B3%D8%B1%D9%88%D8%B1-nzpogzvsh62h</link>
                <description>Server-Side Swiftوقتی صحبت از زبان های برنامه نویسی server-side میشه، معمولا زبان های اسکریپتی (Scripting Languages) مثل PHP، Python و JavaScript و یا زبان های برنامه نویسی (Compiled Languages) مثل Java و #C در ذهن برنامه نویسان خطور میکنه. سالها از معرفی اکثر این زبان ها میگذره و دنیای برنامه نویسی تغییرات زیادی کرده. همواره نیاز برای زبان های تازه که بهتر از تکنولوژی های جدید پشتیبانی بکنن احساس میشده. مثلا با اینکه PHP یک زبان اسکریپت بسیار پر طرفدار برای برنامه نویسی وب و server-side است، اما به هر حال ساختار زبان و تکنولوژی اون مال  دهه های پیشه. شرکت اپل هم که زبان برنامه نویسی Objective-C که بر پایه زبان C ساخته شده بود و برای سیستم عامل های خودش رو توسعه داده بود، تصمیم به ساخت و معرفی زبان جدیدی گرفت.زبان برنامه نویسی Swift در سال 2014 برای نوشتن برنامه برای سیسم عامل های ساخت خود شرکت اپل (iOS, macOS, tvOS) توسط شرکت اپل معرفی شد. یک سال بعد همزمان با معرفی نسخه 2، اپل اعلام کرد که زبان Swift را به صورت متن باز (Open source) عرضه میکند. این تصمیم اپل باعث شد که پای این زبان به سیستم عامل های دیگر مثل Linux باز بشه. بلافاصله شرکت های بزرگ (از جمله IBM) و کوچک شروع به سرمایه گذاری بر روی زبان Swift و نوشتن Framework بر پایه این زبان کردند. با توجه به جدید بودن این زبان و تغییرات فوق العاده زیادی که در هر ورژن میکرد، توسعه فریمورک های (Framework) این زبان رشد زیادی نداشت. اکثرا توسعه دهنگان مجبور به دوباره نوشتن قسمت های پایه فریمورک بودند. اما بعد از معرفی نسخه 4 و ثبات ساختار کلی این زبان رشد فریمورک های Swift بیشتر شد. تا الان 4 فریمورک بر پایه این زبان معرفی شده PerfectVaporKituraZewoکه در پست های بعدی به معرفی آنها میپردازم.</description>
                <category>هادی شرقی</category>
                <author>هادی شرقی</author>
                <pubDate>Sun, 28 Oct 2018 17:32:49 +0330</pubDate>
            </item>
            </channel>
</rss>