<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mojtaba Mirzadeh</title>
        <link>https://virgool.io/feed/@msd.mirzadeh4</link>
        <description>توسعه‌دهنده ارشد iOS | علاقه‌مند به هوش مصنوعی و یادگیری ماشینی | مدرس برنامه‌نویسی iOS</description>
        <language>fa</language>
        <pubDate>2026-06-16 14:00:36</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3382417/avatar/avatar.png?height=120&amp;width=120</url>
            <title>Mojtaba Mirzadeh</title>
            <link>https://virgool.io/@msd.mirzadeh4</link>
        </image>

                    <item>
                <title>آشنایی با Constant، Variable و Data Types در زبان Swift</title>
                <link>https://virgool.io/@msd.mirzadeh4/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-constant-variable-%D9%88-data-types-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-swift-vwisjg2yluh1</link>
                <description>Swift Fundamentalsبیایید با یکی از ابتدایی‌ترین مفاهیم زبان سوئیفت (Swift) شروع کنیم: متغیرها (Variables)، ثابت‌ها (Constants) و انواع داده (Data Types). این مفاهیم مهم هستند چون هر زبانی برای ذخیره و پردازش اطلاعات به متغیرها و انواع داده نیاز دارد.ثابت‌ها (Constants)• ثابت‌ها مقادیری هستند که بعد از یک بار مقداردهی، قابل تغییر نیستند.• وقتی می‌خواهیم مقداری را تعریف کنیم که هیچ‌وقت در طول برنامه عوض نشود، از ثابت استفاده می‌کنیم.در سوئیفت برای تعریف ثابت از واژه‌ی کلیدی let استفاده می‌کنیم: https://gist.github.com/smsdm4/4348c48940d27a54e1379637db4ed6df • اگر بعد از تعریف pi بخواهید به آن مقدار دیگری بدهید، کامپایلر به شما ارور می‌دهد.چرا از ثابت استفاده می‌کنیم؟• امنیت کد و اطمینان از اینکه اطلاعات ثابت به‌صورت ناخواسته دستکاری نشود.• همچنین برای خوانایی بیشتر کد و مشخص‌کردن اینکه برخی مقادیر در طول اجرای برنامه هیچ تغییری نخواهند کرد.متغیرها (Variables)• متغیرها در طول برنامه، امکان تغییر مقدار را دارند.• وقتی داده‌ای داریم که انتظار داریم در طول برنامه تغییر کند (مثلاً امتیاز یک بازی یا محاسباتی که قرار است آپدیت شود)، از متغیر استفاده می‌کنیم.در سوئیفت برای تعریف متغیر از واژه‌ی کلیدی var استفاده می‌کنیم: https://gist.github.com/smsdm4/1eef5773f626bcf3d6836fec205efc29 • همان‌طور که می‌بینید، برخلاف ثابت، این مقدار قابل تغییر است.انواع داده (Data Types)زبان Swift Type-Safe است؛ یعنی خود زبان به صورت جدی با انواع داده کار می‌کند و اجازه نمی‌دهد نوع داده‌ها به‌طور نادرست ترکیب شوند. چند تا از پراستفاده‌ترین انواع داده در Swift عبارت‌اند از:1. Int: برای اعداد صحیح (مثبت، منفی، صفر)2. Double و Float: برای اعداد اعشاری (Double دقت بیشتری دارد)3. Bool: برای مقادیر منطقی (true یا false)4. String: برای رشته‌ها و متن‌ها5. Character: برای یک کاراکتر واحدمثال ساده: https://gist.github.com/smsdm4/e9df7fa61d5e1d752e3edd762918fff0 • در سوئیفت، اگر مقدار اولیه را تعیین کنید و از نوع آن واضح باشد، Type Inference (استنباط نوع داده) به صورت خودکار انجام می‌شود.نکات کلیدی1. حتماً در انتخاب بین let و var دقت کنید. اگر می‌دانید مقدار تغییر نمی‌کند، بهتر است let استفاده کنید. این کار باعث می‌شود کد شما امن‌تر و واضح‌تر باشد.2. نوع داده صحیح را انتخاب کنید. اگر لازم است اعشار داشته باشید، از Double استفاده کنید. اگر قرار نیست مقدار منفی داشته باشید، می‌توانید از UInt (عدد صحیح بدون علامت) استفاده کنید.3. تمرین زیادی انجام دهید. توصیه می‌کنم چند نمونه کد بنویسید و متغیرها یا ثابت‌ها را درون آن‌ها تغییر بدهید تا با خطاهای احتمالی هم آشنا شوید.نمونه‌کد ترکیبی https://gist.github.com/smsdm4/bb3fb2fafd8e260d763113a07e7631f7 • در این مثال، maxPlayers یک ثابت است. مقدار آن در طول اجرا نباید تغییر کند و اگر تغییر دهیم، خطا می‌گیریم.• بقیه موارد هم متغیر هستند و در طول برنامه ممکن است تغییر کنند.بطور خلاصه• Constant (با let) برای داده‌هایی که هرگز تغییر نمی‌کنند.• Variable (با var) برای داده‌هایی که در طول اجرا تغییر خواهند کرد.• Data Types (Int، Double، String و …) برای مشخص‌کردن اینکه داده از چه نوعی است و چه عملیاتی روی آن مجاز است.با تسلط روی این مفاهیم اولیه، می‌توانیم در پست بعدی وارد مباحث بعدی مانند آرایه ها (Arrays) و حلقه ها (For Loops) شویم.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Mon, 06 Jan 2025 11:43:44 +0330</pubDate>
            </item>
                    <item>
                <title>پرامپت‌نویسی: چطوری با سوال‌های درست، هوش مصنوعی رو به حرف بیاریم!</title>
                <link>https://virgool.io/@msd.mirzadeh4/%D9%BE%D8%B1%D8%A7%D9%85%D9%BE%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D8%A7-%D8%B3%D9%88%D8%A7%D9%84-%D9%87%D8%A7%DB%8C-%D8%AF%D8%B1%D8%B3%D8%AA-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%B1%D9%88-%D8%A8%D9%87-%D8%AD%D8%B1%D9%81-%D8%A8%DB%8C%D8%A7%D8%B1%DB%8C%D9%85-z97julkla345</link>
                <description>توی این بحث می‌خوام خیلی راحت و خودمونی برات توضیح بدم که پرامپت نویسی چیه و چطوری می‌تونی ازش استفاده کنی.پرامپت نویسی چیه؟پرامپت نویسی یعنی اینکه بدونی چطوری با هوش مصنوعی مثل ChatGPT صحبت کنی تا جواب‌های بهتری بگیری. مثل وقتی که می‌خوای با یه همکار یا دوستت حرف بزنی و باید خواستت رو درست و دقیق بگی.چطوری پرامپت خوب بنویسیم؟بی‌خیال کلمات سخت! بیا با چند تا نکته ساده شروع کنیم:1. واضح و مشخص باش: دقیقا بگو چی می‌خوای.• 🛑 اشتباه: “برام کد بنویس.”• ✅ درست: “یه نمونه کد Swift می‌خوام که نشون بده چطوری یه جدول در UIKit بسازم.”2. جزئیات بده: هرچی بیشتر توضیح بدی، جواب بهتری می‌گیری.• 🛑 اشتباه: “درباره شبکه بگو.”• ✅ درست: “توضیح بده که چطوری می‌تونم با URLSession یه درخواست GET ارسال کنم.”3. ساده حرف بزن: لازم نیست رسمی باشه، راحت باش!• 🗣️ “می‌خوام بدونم چطوری می‌تونم از Core Data برای ذخیره اطلاعات استفاده کنم.”4. اگه می‌تونی مثال بزن: اینجوری هوش مصنوعی بهتر می‌فهمه چی می‌خوای.• 🗣️ “مثلاً چطوری می‌تونم یه لیست از آیتم‌ها رو توی TableView نشون بدم؟”بیایم با هم دو تا مثال واقعی از برنامه‌نویسی Swift رو بررسی کنیم و ببینیم چطور پرامپت‌های مختلف می‌تونن جواب‌های متفاوتی بدن. اینطوری بهتر متوجه می‌شیم چطور نوشتن پرامپت درست می‌تونه بهت کمک کنه.مثال ۱: ساخت یک دکمه که وقتی روش کلیک می‌شه، یه پیام نشون بدهپرامپت نادرست:🛑 “چطوری دکمه بسازم؟”جواب احتمالی ChatGPT به پرامپت نادرست:“برای ساخت دکمه در Swift، می‌تونی از UIButton استفاده کنی.”پرامپت درست:✅ “می‌خوام با استفاده از UIKit یه دکمه بسازم که وقتی روش کلیک می‌کنم، یه Alert با پیام ‘Hello World’ نمایش بده. می‌تونی کد مربوطه رو برام بنویسی؟”جواب احتمالی ChatGPT به پرامپت درست:حتماً! در اینجا نمونه کدی هست که اون چیزی که می‌خوای رو انجام می‌ده: https://gist.github.com/smsdm4/b84c4c672550139a3e6d5dd016e88bd2 توضیح:• یک دکمه ایجاد کردیم و عنوانش رو “نمایش پیام” گذاشتیم.• وقتی روی دکمه کلیک می‌شه، تابع showMessage فراخوانی می‌شه.• در تابع showMessage، یک Alert با پیام “Hello World” نمایش داده می‌شه.تحلیل تفاوت‌ها:• پرامپت نادرست: خیلی کلی و مبهمه. فقط پرسیده “چطوری دکمه بسازم؟” ChatGPT هم یک جواب کلی داده که از UIButton استفاده کنه.• پرامپت درست: دقیقاً توضیح داده که چی می‌خواد، با جزئیات کامل. ChatGPT هم تونسته کد کامل و توضیح دقیقی براش بنویسه.مثال ۲: دانلود تصویر از اینترنت و نمایش آن در UIImageViewپرامپت نادرست:🛑 “چطوری تصویر دانلود کنم؟”جواب احتمالی ChatGPT به پرامپت نادرست:“برای دانلود تصویر در Swift، می‌تونی از URLSession استفاده کنی.”پرامپت درست:✅ “می‌خوام با استفاده از Swift یه تصویر رو از یه URL دانلود کنم و توی UIImageView نمایش بدم. می‌تونی نمونه کدش رو بهم بدی؟”جواب احتمالی ChatGPT به پرامپت درست:البته! اینجا نمونه کدی هست که تصویر رو از اینترنت دانلود می‌کنه و نمایش می‌ده: https://gist.github.com/smsdm4/214be7a81b30e34b71e2aa22febb43eb توضیح:• یک UIImageView ایجاد کردیم و به View اضافه کردیم.• ادرس یا URL تصویر رو مشخص کردیم.• با استفاده از URLSession، تصویر رو دانلود کردیم.• بعد از دانلود، تصویر رو در imageView نمایش دادیم.تحلیل تفاوت‌ها:• پرامپت نادرست: مشخص نیست دقیقاً چی می‌خواد. فقط پرسیده “چطوری تصویر دانلود کنم؟” بنابراین جواب ChatGPT هم کلی بود.• پرامپت درست: دقیقاً توضیح داده که می‌خواد تصویر رو دانلود کنه و نمایش بده، و از ChatGPT نمونه کد خواسته. بنابراین ChatGPT تونسته جواب کامل و مفیدی بهش بده.چند تا نکته طلایی• سوالاتت رو مرحله به مرحله بپرس: اگه موضوع پیچیده‌س، می‌تونی تیکه تیکه بپرسی.• اول بپرس چطوری یه چیز کلی کار می‌کنه، بعد بری سر جزئیات.• اگه جواب راضی‌کننده نبود، دوباره امتحان کن: شاید لازم باشه پرامپتت رو یه کم تغییر بدی.• “می‌تونی بیشتر توضیح بدی؟”• “این قسمت رو نفهمیدم، می‌شه ساده‌تر بگی؟”حالا چرا پرامپت نویسی مهمه؟چون وقتی درست بپرسی، جواب بهتری می‌گیری و کارت سریع‌تر راه می‌افته. مثل اینه که توی Stack Overflow سوال می‌پرسی؛ هرچی سوالت واضح‌تر باشه، جواب بهتری می‌گیری.جمع‌بندی• روون و خودمونی حرف بزن.• دقیق بگو چی می‌خوای.• از مثال‌ها استفاده کن.• نترس از اینکه دوباره بپرسی یا بیشتر توضیح بخوای.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Mon, 25 Nov 2024 12:28:12 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی State@ در SwiftUI: راه و روش راحت کنترل وضعیت با یه تیر و دو نشون (هم تغییر، هم نمایش!)</title>
                <link>https://virgool.io/@msd.mirzadeh4/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-state-%D8%AF%D8%B1-swiftui-%D8%B1%D8%A7%D9%87-%D9%88-%D8%B1%D9%88%D8%B4-%D8%B1%D8%A7%D8%AD%D8%AA-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-%D8%A8%D8%A7-%DB%8C%D9%87-%D8%AA%DB%8C%D8%B1-%D9%88-%D8%AF%D9%88-%D9%86%D8%B4%D9%88%D9%86-%D9%87%D9%85-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%87%D9%85-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-q7hs3jmx2yeb</link>
                <description>دقیقا State@ در SwiftUi چیست؟در SwiftUI، وقتی می‌خواهیم داده‌ای داشته باشیم که هر وقت تغییر کند، رابط کاربری (UI) هم بلافاصله تغییر کنه، از یه چیزی به اسم State@ استفاده می‌کنیم. به زبان خیلی ساده، State@ یه روشه که کمک می‌کنه تا داده‌ها درون یک View مدیریت بشن. هر وقت این داده‌ها عوض بشن، SwiftUI می‌فهمه و خود به خود رابط کاربری رو آپدیت می‌کنه تا تغییرات رو ببینیم.چرا به @State نیاز داریم؟فرض کن توی SwiftUI یه دکمه داری و می‌خوای هر بار که روی دکمه کلیک می‌کنی، یه عدد زیاد بشه و این عدد رو روی صفحه نمایش بدی. State@ باعث میشه SwiftUI بفهمه وقتی عدد تغییر می‌کنه، باید صفحه رو دوباره رندر کنه و عدد جدید رو نمایش بده. بدون State@، قطعا SwiftUI نمی‌فهمه که داده عوض شده و بنابراین UI هم ثابت می‌مونه.یه مثال بزنیم که باهاش کاملاً قضیه رو متوجه بشی: https://gist.github.com/smsdm4/e14a86329ac27343a4a42b3542b0b53d ۱- اینجا ما یه متغیر به نام counter داریم که از نوع State@ هست. یعنی اگه مقدارش تغییر کنه، SwiftUI به طور خودکار صفحه رو آپدیت می‌کنه.۲- با Text(&quot;Counter: \(counter)&quot;) مقدار counter رو توی متن نمایش می‌دیم.۳- دکمه (:Button(action هر بار که روش کلیک بشه، مقدار counter رو یک واحد زیاد می‌کنه. بعدش SwiftUI به‌طور خودکار مقدار جدید رو توی UI نمایش می‌ده.مثال دیگر: تغییر رنگ پس‌زمینهحالا بیایید یه مثال دیگه بزنیم که کاربر با کلیک روی دکمه، رنگ پس‌زمینه رو تغییر بده: https://gist.github.com/smsdm4/c8f01cf5dc86d484832f2196c6b14505 ۱- اینجا یه متغیر داریم که میگه پس‌زمینه آبی هست یا نه.۲- اگه مقدار isBlue (True) باشه، رنگ پس‌زمینه آبی میشه، اگه نه، سبز میشه.۳- با کلیک روی دکمه، مقدار isBlue عوض میشه و رنگ پس‌زمینه تغییر می‌کنه.چرا چنین چیزی رو در UIKit نداشتیم؟توی UIKit، که قبلتر از SwiftUI برای ساخت اپ‌های iOS استفاده می‌شد، چنین چیزی به این راحتی وجود نداشت. توی UIKit، برنامه‌نویس‌ها باید به‌صورت دستی وضعیت داده‌ها و رابط کاربری رو هماهنگ می‌کردن. مثلاً اگه می‌خواستی با یه دکمه یه عدد رو زیاد کنی، باید اول مقدار متغیر رو عوض می‌کردی و بعدش به‌طور دستی به رابط کاربری می‌گفتی که متن رو آپدیت کنه.مثال ساده توی UIKit این شکلی بود: https://gist.github.com/smsdm4/0be4aa365078a7547a80dce10bdf9e6a تو این روش، باید خودت به‌طور مستقیم بگی &quot;آقا، متن برچسب رو عوض کن!&quot; ولی تو SwiftUI با State@ همه چی خودکار انجام می‌شه. SwiftUI خودش می‌فهمه که باید چی کار کنه.تفاوت اصلی در SwiftUI:۱- تو SwiftUI وقتی از @State استفاده می‌کنی، داده‌ها و UI همیشه با هم همگام هستن و نیاز نیست هیچ کار اضافه‌ای انجام بدی.۲- در UIKit اینطوری نبود و باید خودت دستی همه چی رو مدیریت می‌کردی.نکات تکمیلی درباره State@:۱- توجه کنید که State@ فقط برای View‌های محلیه: یعنی اگه وضعیت (state) فقط توی یه View تغییر می‌کنه، از State@ استفاده می‌کنی. ولی اگه قرار باشه بین چند View مختلف از یه داده استفاده بشه، باید از چیزای دیگه‌ای مثل Binding@ یا ObservedObject@ استفاده کنی.۲- محدودیت استفاده در Struct: تو SwiftUI، هاView به‌صورت Struct تعریف می‌شن که نوعشون Immutable یا غیرقابل تغییره. State@ کمک می‌کنه داده‌های متغیر (مانند counter) رو بدون مشکل توی این ساختارها مدیریت کنیم.۳- چرخه حیات State@: اگه View از صفحه حذف بشه، مقدار State@ هم از دست می‌ره. یعنی اگه مثلاً یه صفحه بره و برگرده، مقدار State@ دوباره از اول شروع می‌شه.۴- برای مقادیر ساده مناسبه: State@ بیشتر برای چیزای ساده مثل اعداد و رشته‌ها خوبه. اگه وضعیت پیچیده‌تری داری، بهتره از ObservedObject@ استفاده کنی.۵- بازسازی View: هر وقت مقدار State@ تغییر کنه، SwiftUI کل View رو از نو می‌سازه. این بازسازی می‌تونه رو عملکرد تأثیر بذاره، پس حواست باشه که خیلی پرکاربرد نباشه اگه داده‌های پیچیده داری.۶- تغییرات در Main Thread: تغییرات در State@ باید روی Main Thread (رشته اصلی) انجام بشه، چون SwiftUI به UI حساسه و همه تغییرات رو باید همون‌جا هندل کنه.اگه قراره تغییری رو توی پس‌زمینه (Background) انجام بدی، باید از این استفاده کنی: https://gist.github.com/smsdm4/44ca0ae3db2d2777e16f9849f5bfb85a ۷- استفاده از Binding@ با State@: اگه یه متغیر State@ رو بخوای به یه View دیگه بدی تا اونم تغییرش بده، از Binding@ استفاده می‌کنی.مثلا: https://gist.github.com/smsdm4/0fe3a48fc0c3625246cc9b2cbfcc91b5 ۸- رابطه State@ و انیمیشن‌ها: تغییرات توی State@ خیلی راحت می‌تونن با انیمیشن همراه بشن. مثلا هر وقت State@ تغییر کنه، SwiftUI خودش انیمیشن اعمال می‌کنه: https://gist.github.com/smsdm4/b4c129e53f8d19dd9f2579fc8989cbb1 ۹- رابطه $ با @State: وقتی در SwiftUI از State@ استفاده می‌کنیم، خود State@ در واقع به ما اجازه می‌ده که مقدار متغیر رو کنترل کنیم. اما وقتی می‌خواهیم این مقدار رو به یه View دیگه یا یک کنترل (مثل Toggle یا Slider) بدیم و اونجا هم اجازه بدیم که تغییرش بدن، باید از یه چیزی به نام Binding استفاده کنیم. اینجا است که علامت $ وارد میشه.به زبان خیلی ساده: $ کمک می‌کنه که &quot;کنترل دوطرفه&quot; داشته باشیم. یعنی هم بتونی مقدار رو از یک View بگیری و هم از داخل یه View دیگه اونو تغییر بدی.برای مثال:فرض کن یه Switch (Toggle) داری و می‌خواهی با کلیک روی اون، یه مقدار بولین (True یا False) رو تغییر بدی. برای این کار باید از $استفاده کنیم تا مقدار ‌Bool با Toggle همگام بشه و اگه کاربر Switch رو تغییر داد، مقدار بولین هم عوض بشه. https://gist.github.com/smsdm4/496d92138510f8fdd981311d64528207 ۱- اینجا یه متغیر به اسم isOn داریم که مشخص می‌کنه آیا Switch روشنه یا خاموش.۲- اینجا علامت $ می‌گه &quot;من دارم این متغیر رو به صورت Binding به Toggle میدم.&quot; یعنی حالا Toggle می‌تونه مستقیماً مقدار isOn رو تغییر بده.۳- منظور $isOn اینه که به این متغیر اجازه بده از بیرون هم تغییر کنه. اگه فقط isOn رو بدون $ بفرستی، دیگه تغییرات رو نمی‌تونی از داخل Toggle بگیری.و در نهایت:کلا State@ یه راه ساده و راحت برای مدیریت وضعیت‌های داخلی تو SwiftUI است.هر وقت داده‌ها تغییر کنه، SwiftUI خودش رابط کاربری رو آپدیت می‌کنه.تو UIKit چنین چیزی به این راحتی نداشتیم و باید دستی همه چی رو کنترل می‌کردیم.کلا State@ برای مقادیر ساده خیلی خوبه، ولی اگه وضعیت پیچیده‌تری داری، باید از ابزارهای دیگه‌ای استفاده کنی مثل ObservedObject@.حواست باشه تغییرات State@ باید تو Main Thread انجام بشه و View رو بازسازی می‌کنه.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Fri, 18 Oct 2024 14:29:22 +0330</pubDate>
            </item>
                    <item>
                <title>چرا در SwiftUI از استراکچر استفاده می‌کنیم ولی در UIKit از کلاس‌ها؟</title>
                <link>https://virgool.io/@msd.mirzadeh4/%DA%86%D8%B1%D8%A7-%D8%AF%D8%B1-swiftui-%D8%A7%D8%B2-%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%DA%A9%DA%86%D8%B1-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-%D9%88%D9%84%DB%8C-%D8%AF%D8%B1-uikit-%D8%A7%D8%B2-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7-y1fte6aidzpw</link>
                <description>در دنیای برنامه‌نویسی iOS، وقتی با SwiftUI کار می‌کنید، بیشتر Viewها به صورت استراکچر (Struct) ساخته می‌شوند. اما در UIKit، اغلب با کلاس‌ها (Class) سروکار داریم (در یک پست در مورد دو تفاوت اصلی class و struct صحبت کردیم) . شاید از خودتان بپرسید چرا؟ بیایید این موضوع را به زبان ساده و با استفاده از مثال‌های کدی بیشتر توضیح دهیم.چرا در SwiftUI از استراکچر استفاده می‌کنیم؟ معماری متفاوت: SwiftUI یک روش متفاوت برای ساخت رابط کاربری ارائه شده می‌دهد. این روش را Declarative می‌نامند، یعنی شما فقط می‌گویید «چه چیزی» می‌خواهید نشان دهید و سیستم خود را بهینه‌ترین روش را برای انجام این کار پیدا کنید. از آنجایی که استراکچرها Value-Type هستند (یعنی وقتی کپی می‌شوند، یک کپی برای این سریع می‌سازند)، خیلی و سبک هستند و نوع معماری بسیار مناسب‌اند.بازدهی بالا: در SwiftUI، هر بار که رابط کاربری تغییر می‌کند، یک نسخه جدید از View ساخته می‌شود. چون استراکچرها خیلی سریع کپی می‌شوند، این کار باعث کاهش مصرف حافظه و افزایش سرعت برنامه می‌شود.ایمنی در برابر تغییرات ناخواسته: چون استراکچرها یک کپی از خودشان ایجاد می‌کنند، هر وقت شما یک استراکچر را به متغیر دیگری اختصاص می‌دهید، تغییرات در متغیر جدید تأثیری روی نسخه اصلی ندارد. این باعث می‌شود برنامه‌های شما ایمن‌تر و کمتر مستعد خطا باشند. https://gist.github.com/smsdm4/ded2d371a291e83b72b11a89d6da1aa2 در این مثال، ContentView یک استراکچر است که یک متن ساده را نمایش می‌دهد.چرا در UIKit از کلاس‌ها استفاده می‌کنیم؟نیاز به تغییرات پویا: UIKit به شما اجازه می‌دهد که رابط کاربری را به صورت Imperative بسازید، یعنی می‌توانید به طور دقیق «چطور» و «چه زمانی» را مشاهده کنید. کلاس‌ها به عنوان Refrence-Type خیلی برای این نوع تغییرات پویا مناسب‌اند، چون تغییر در یک مرجع باعث تغییر در همه جاهایی می‌شود که به آن مرجع اشاره می‌کنند.وراثت و قابلیت‌های پیشرفته: کلاس‌ها امکان وراثت (Inheritance) دارند، یعنی می‌توانید یک کلاس پایه داشته باشید و کلاس‌های دیگری بسازید که از آن ارث‌بری کنند. این ویژگی در UIKit بسیار مفید است، چرا که می‌توانید ویژگی‌ها و رفتارهای مشترک بین Viewها را به راحتی به اشتراک بگذارید. https://gist.github.com/smsdm4/f5ad3fa29aa7b0b29e9aacb90d078f6e در این مثال، MyViewController یک کلاس است که یک UILabel را به View اصلی اضافه می‌کند.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Fri, 23 Aug 2024 13:15:38 +0330</pubDate>
            </item>
                    <item>
                <title>مروری جامع بر الگوی طراحی (Design Pattern) Singleton در سوئیفت (Swift)</title>
                <link>https://virgool.io/@msd.mirzadeh4/%D9%85%D8%B1%D9%88%D8%B1%DB%8C-%D8%AC%D8%A7%D9%85%D8%B9-%D8%A8%D8%B1-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-design-pattern-singleton-%D8%AF%D8%B1-%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA-swift-jgax4pau1yt4</link>
                <description>الگوی Singleton یکی از ساده‌ترین و پرکاربردترین الگوهای طراحی در برنامه‌نویسی است. این الگو به ما کمک می‌کند تا مطمئن شویم یک کلاس تنها یک نمونه (Instance) دارد و تمام برنامه به همان نمونه دسترسی دارد. اگر بخواهیم از این الگو استفاده کنیم، کلاس مورد نظر فقط یک بار می‌تواند ساخته شود و هر جایی که لازم باشد، همون نمونه (Instance) اولیه رو برمی‌گردونه.پیاده‌سازی Singleton در سویفتفرض کنید یک کلاس به نام Logger داریم که مسئول نوشتن لاگ‌ها (یعنی گزارش‌ها) در یک فایل است. ما می‌خواهیم مطمئن باشیم که فقط یک Logger داریم که همه لاگ‌ها را مدیریت می‌کند. https://gist.github.com/smsdm4/8477ca0d9114ccd1b9b40cfd46eaec2e بررسی کد:تعریف نمونه ثابت: ما یک متغیر استاتیک به نام shared داخل کلاس تعریف کردیم. این متغیر همان نمونه Singleton است که با استفاده از کلمه کلیدی static به همه قسمت‌های برنامه دسترسی دارد.خصوصی کردن initializer: با خصوصی کردن initializer (private init())، جلوی ساخت نمونه‌های جدید از این کلاس را گرفتیم. یعنی هیچ‌کس نمی‌تواند از این کلاس نمونه جدید بسازد و باید از همان نمونه shared استفاده کند.متد برای نوشتن لاگ‌ها: این متد به سادگی یک پیام را می‌گیرد و آن را در کنسول چاپ می‌کند. فرض کنید به جای چاپ کردن، این پیام‌ها در یک فایل ذخیره شود.استفاده از Singletonحالا که Logger ما آماده است، ببینیم چطور از آن استفاده کنیم: https://gist.github.com/smsdm4/104b78e8dc24a6e8d9d6e58e593f1b9c هر وقت بخواهید یک لاگ بنویسید، فقط از Logger.shared استفاده می‌کنید. نکته مهم این است که هر جا در برنامه‌تان از Logger.sharedاستفاده کنید، همان یک نمونه Logger مورد استفاده قرار می‌گیرد.چرا از Singleton استفاده کنیم؟از Singleton استفاده می‌کنیم وقتی که:منبعی محدود داریم: وقتی یک منبع محدود وجود دارد که می‌خواهیم تمام برنامه فقط به آن دسترسی داشته باشد، مثل دسترسی به یک دیتابیس یا یک تنظیمات مشترک.کنترل مرکزی نیاز داریم: اگر نیاز باشد که یک کنترل مرکزی برای دسترسی به یک منبع یا یک بخش از برنامه داشته باشیم، Singleton راه‌حل خوبی است.صرفه‌جویی در منابع: وقتی که ایجاد و نگهداری چندین نمونه از یک کلاس پرهزینه است و می‌خواهیم فقط یک بار آن را ایجاد کنیم.چالش‌های Singletonبا وجود اینکه Singleton خیلی مفید است، اما چالش‌هایی هم دارد:مشکل در تست‌ها (Unit Testing): یکی از بزرگ‌ترین چالش‌های Singleton این است که چون همیشه همان یک نمونه از کلاس وجود دارد، تست کردنش خیلی سخت می‌شود.وابستگی‌های پنهان (Hidden Dependencies): Singleton‌ها معمولاً وابستگی‌های پنهان در کد ایجاد می‌کنند، که باعث می‌شود کد سخت‌تر قابل نگهداری باشد.مسائل مرتبط با Multi-threading: اگر Singleton در محیط‌های چند ریسمانی (Multi-threaded) استفاده شود، باید مطمئن شویم که در مواقعی که چندین رشته به صورت همزمان به Singleton دسترسی دارند، مشکلاتی مثل دسترسی همزمان یا مشکلات همزمانی پیش نیاید.جایگزین‌های Singletonبله، Singleton جایگزین‌هایی هم دارد:جایگزینی به نام Dependency Injection (DI): به جای استفاده از Singleton، می‌توانیم از الگوی Dependency Injection استفاده کنیم. این کار کمک می‌کند تا وابستگی‌ها آشکارتر شوند و همچنین کد راحت‌تر تست شود. جایگزین دیگری به نام Service Locator: این الگو شبیه به Singleton است اما انعطاف‌پذیرتر. به جای اینکه خود کلاس Singleton را مستقیم فراخوانی کنیم، از یک سرویس واسط استفاده می‌کنیم که مسئول پیدا کردن و ارائه منابع مورد نیاز باشد.چرا جایگزین‌ها را انتخاب نمی‌کنیم؟اگرچه جایگزین‌هایی مثل DI و Service Locator مزایای خودشان را دارند، اما هر کدام چالش‌های خودشان را هم دارند:پیچیدگی بیشتر: پیاده‌سازی DI یا Service Locator نسبت به Singleton پیچیده‌تر است و نیاز به تنظیمات بیشتری دارد.نیاز به پیکربندی‌های بیشتر: پیاده‌سازی این الگوها نیاز به پیکربندی‌ها و زیرساخت‌های خاصی دارد که ممکن است برای پروژه‌های کوچک بیش از حد پیچیده باشد.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Fri, 09 Aug 2024 15:15:33 +0330</pubDate>
            </item>
                    <item>
                <title>همه چیز درباره‌ی کلاس‌ها و استراکچرها در SwiftUI و UIkit</title>
                <link>https://virgool.io/@msd.mirzadeh4/%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7-%D9%88-%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%DA%A9%DA%86%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-swift-r4aqhym3zzoc</link>
                <description>مقدمهدر برنامه‌نویسی iOS، استفاده از کلاس‌ها (Classes) و استراکچرها (Structures) دو روش اصلی برای تعریف داده‌ها و عملکردهای مورد نیاز هستند. این دو مفهوم هر دو به شما اجازه می‌دهند تا داده‌ها و توابع مرتبط را در یک نوع داده جمع‌آوری کنید، اما تفاوت‌های مهمی نیز بین آن‌ها وجود دارد. در این پست، به بررسی این تفاوت‌ها و کاربردهای هر یک می‌پردازیم.کلاس‌ها (Classes)کلاس‌ها نوعی از داده‌ها هستند که قابلیت وراثت (Inheritance) دارند، به این معنا که می‌توانید از یک کلاس پایه، کلاس‌های دیگری ایجاد کنید که تمام ویژگی‌ها و توابع کلاس پایه را به ارث می‌برند. همچنین، کلاس‌ها به صورت Reference Type هستند، به این معنا که وقتی یک کلاس را به یک متغیر دیگر اختصاص می‌دهید، هر دو متغیر به همان شیء اصلی اشاره می‌کنند. https://gist.github.com/smsdm4/ce504b28862bdcc56a593d24376e5e59 استراکچرها (Structures)استراکچرها نیز مشابه کلاس‌ها هستند، اما چند تفاوت کلیدی دارند. استراکچرها Value Type هستند، به این معنا که هر وقت یک استراکچر را به یک متغیر دیگر اختصاص می‌دهید، یک کپی از داده‌ها ایجاد می‌شود. استراکچرها نمی‌توانند وراثت را پشتیبانی کنند. https://gist.github.com/smsdm4/00a62d2674c736942b7b740af8082383 Reference Type و Value Typeهمان‌طور که مشاهده کردید، کلاس‌ها Reference Type هستند، به این معنا که وقتی یک شیء کلاس به یک متغیر دیگر اختصاص داده می‌شود، هر دو متغیر به همان شیء اصلی اشاره می‌کنند. استراکچرها Value Type هستند و هر وقت یک شیء استراکچر به یک متغیر دیگر اختصاص داده می‌شود، یک کپی از داده‌ها ایجاد می‌شود. https://gist.github.com/smsdm4/da987610847e3067cdb421609b692e16 مثال از Reference Type (کلاس‌ها)  https://gist.github.com/smsdm4/d30cf7a8d6fe4a4a90951a4cb141b764 مثال از Value Type (استراکچرها)وراثت (Inheritance)وراثت به شما اجازه می‌دهد تا کلاس‌های جدیدی بر اساس کلاس‌های موجود ایجاد کنید. این ویژگی تنها در کلاس‌ها موجود است و استراکچرها از آن پشتیبانی نمی‌کنند. https://gist.github.com/smsdm4/85197a966c733ef0d95c008b996485f4 استفاده از کلاس‌ها و استراکچرها در UIKit و SwiftUIکلاس‌ها و استراکچرها در هر دو فریم‌ورک UIKit و SwiftUI به کار می‌روند. برای مثال، UIView و UIViewController در UIKit از کلاس‌ها هستند. در SwiftUI، بسیاری از View ها به صورت استراکچر تعریف شده‌اند. https://gist.github.com/smsdm4/1acf0aa82ec2fd07c6c72d9e2c1a4079  https://gist.github.com/smsdm4/bad99b9553bb91a466208665e3baf074 جمع‌بندیدر این پست، با تفاوت‌ها و کاربردهای کلاس‌ها و استراکچرها در Swift آشنا شدیم. هر کدام از این دو نوع داده ویژگی‌های خاص خود را دارند و بسته به نیاز خود می‌توانید از آن‌ها استفاده کنید. در پست‌های بعدی به موضوعات پیشرفته‌تری مانند پروتکل‌ها، کنترل دسترسی، و مدیریت حافظه خواهیم پرداخت.</description>
                <category>Mojtaba Mirzadeh</category>
                <author>Mojtaba Mirzadeh</author>
                <pubDate>Tue, 16 Jul 2024 13:30:41 +0330</pubDate>
            </item>
            </channel>
</rss>