<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Sajjad Reyhani</title>
        <link>https://virgool.io/feed/@sajjad7997</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-19 11:47:18</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/38257/avatar/p5L6wL.jpg?height=120&amp;width=120</url>
            <title>Sajjad Reyhani</title>
            <link>https://virgool.io/@sajjad7997</link>
        </image>

                    <item>
                <title>یادداشت‌هایی از زیر زمین</title>
                <link>https://virgool.io/@sajjad7997/%DB%8C%D8%A7%D8%AF%D8%AF%D8%A7%D8%B4%D8%AA-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B2-%D8%B2%DB%8C%D8%B1-%D8%B2%D9%85%DB%8C%D9%86-cn8s2adia4at</link>
                <description>یکعمیق‌ترین گودال طبیعی روی زمین، گودال ماریاناست؛ زخمی هلالی‌شکل به عمق ۱۰۹۹۴ متر زیر سطح دریا، جایی نزدیک فیلیپین در اقیانوس آرام. افسانه‌سرایان عهد قدیم از وجود این گودال خبر نداشتند، وگرنه برای ما می‌نوشتند که این زخم عمیق را کدام یک از خدایان و به تلافی کدام گناه بر چهره زمین کاشته است. حدس من این است که اینجا هم پای یک زن در میان بوده است. شاید این داستان به پهلوانی برمی‌گردد که بعد از سال‌ها جنگیدن و گذر از هفت‌خوان و به جا آوردن شروط پادشاه، اجازه وصلت با دخترش را گرفته بود و در راه بازگشت از آخرین نبرد، غرق در خیال رسیدن بود، غافل از اینکه همان موقع زلزله‌ای شدید، دختر و تمام شهر را بلعید و در اعماق خاک دفن کرد. پهلوان وقتی رسید، و دید آرزوهایش در چشم به هم زدنی به تلی از خرابه و آوار تبدیل شده‌اند، به شکایت و دادخواهی از زمین پیش تک تک خدایان رفت. باقی قصه و اینکه هرکدام چطور او را از سر باز کردند و در نهایت کدام‌شان دلش سوخت یا کینه دیگری داشت و در انتقام کمکش کرد، برایم مبهم است. اما چیزی که مسلم است، این است که همه تلاش‌هایش بیهوده بودند. زخم ۱۱ کیلومتری نه درسی برای زمین شد که گاه‌ و بی‌گاه دهان باز کند و جمعی از انسان‌ها را فرو ببرد، و نه التیامی برای پهلوان ما.دوبرای فرار کردن از نور خورشید راه‌های مختلفی هست. ساده‌ترینش این است که یک اتاق ۲ در ۲ بدون سوراخ بسازی و همان جا چمباتمه بزنی. ساده، سرراست و کارآمد است ولی خسته‌کننده. و تازه این یادداشت‌ را هم همین‌جا تمام می‌کند، پس بی‌خیالش می‌شویم.راه دیگر این است که یک زیردریایی جور کنی [ از کجا؟ از زیردریایی فروشی.] و در اقیانوس پایین بروی، هر چه پایین‌تر، تاریک‌تر. بعد از ۱۰۰۰ متر ظلمت مطلق است و حتی سمج‌ترین پرتوهای نور هم دستشان به تو نمی‌رسد. عجیب است، آبی که به شفافیت و زلال بودن شهره‌ است ریزه ریزه آلودگی‌هایش به اندازه کافی که روی هم انبار شوند همانقدر نور از خودش رد می‌کند که یک بلوک سیمانی.اما راه سوم: یک بیل برداری و شروع کنی به کندن زمین و همان اتاقک ۲x۲ را زیر زمین بسازی. آن‌جا اگر چه که نور نیست اما مظاهر دیگرش هستند. کورمال کورمال که دست بکشی، ریشه‌ درختانی که سال‌ها با برگشان نور جذب کرده‌اند و چاق و چله شده‌اند را حس می‌کنی. موش و کرم و سایر جانوران هم هستند که مدام به دست و پایت می‌خورند و دنیای روشن بالا را یادآوری می‌کنند. از این‌ها هم بخواهی دور شوی باید باز هم پایین‌تر بروی، خیلی پایین‌تر.سهرقابت فضایی آمریکا و شوروی در جنگ سرد را همه شنیده‌اند. لاقل زمانی که ما بچه‌ بودیم شنیدیم، نسل جدیدتر را نمیدانم. هر کدام سعی می‌کردند زودتر به اعماق دورتری از فضا برسند. همان زمان اما رقابت دیگری هم - در مسیر برعکس - بین دو کشور در جریان بود. اینکه کدام می‌تواند به عمق بیشتری از زمین نفوذ کند و زودتر به لایه گوشته برسد. آمریکایی‌ها تا یک جایی جلو رفتند ولی دیدند هزینه‌های اینکار به دستاوردهایش نمی‌ارزد و باقی مسابقه را جدی نگرفتند. هرچند که همان زمان هم رکورد عمیق‌ترین چاه دستشان بود، یک شرکت خصوصی که اصلا کاری به این بازی‌های سیاست هم نداشت چاهی ۹ کیلومتری زده بود تا نفت دربیاورد.روس‌ها اما یک دریل برداشتند و افتادند به جان زمین و تا عمق ۱۲ کیلومتری سوراخ کردند، تا جایی که دمای بالا دیگر اجازه ادامه کار نمی‌داد. چند بار در جهات مختلف تلاش کردند ولی دیدند باز هم نمی‌شود، چاه را به امان خدا رها کردند و امروز یک مرکز مخروبه شبیه چرنوبیل است.ضخامت زمین ۶۷۰۰ کیلومتر است. امروز ۱.۵ متر از آن را کندم. ۶۶۹۹,۹۹۸.۵ متر دیگر حدودا مانده.چهاربنظرم هر آدمی در زندگی باید یکبار بیل و کلنگ بردارد و یک قبر کامل بکند. حالا چه برای عزیزش باشد، چه برای غریبه‌‌ای که کس دیگر را نداشته دفنش کند و چه برای خودش. مقاومت زمین را در برابر تکه تکه شدن ببیند، عرق بریزد و زیرلب فحش بدهد، یا ذکر بگوید. اگر چند تا فیلم و سریال جنایی واقع‌گرایانه دیده باشید می‌فهمید که اصلا هم کار آسانی نیست، مخصوصا برای آدم بی‌تجربه و حداقل 7-8  ساعتی طول می‌کشد. ایده‌آل البته همان است که آدم گور خودش را خودش بکند. ترجیح میدهم روی خاکی بخوابم که عرق خودم پایش ریخته باشد؛ تا اینکه یک گورکن مزدبگیر که روزی ۵ تا شبیه آن را درست می‌کند کنده باشد. یا حتی بدتر از آن، یک بیل مکانیکی در زیر یک دقیقه - بدون ریختن یک قطره عرق و با دود کردن مقداری گازوئیل - درستش کرده باشد و رفته باشد سراغ بعدی.حالا که دارم ‌می‌کَنم و پایین می‌روم حیف است که یک قبر هم این گوشه اضافه نکنم.پنجسلیمان زمانی گفته بود: «زیر آفتاب هیچ چیز تازه نیست». اینجا هم همین است، چه بسا بیشتر از آن‌ بالا تکراری باشد. همه‌‌اش خاک و سنگ و خاک و سنگ. گه گاه یک رگه رنگ جدید میان دیواره پیدا می‌شود. رگه‌ای که چند ده هزار سال همانجا منتظر مانده تا بالاخره چشم یک نفر بهش بیفتد، بگوید :«چه جالب» و به کَندن ادامه دهد. اما فرق بزرگش با بالا این است که برخلاف خورشید که هر صبح جوری از افق بالا می‌آید که انگار قرار است واقعا یک روز تازه داشته باشی، بر خلاف آبی که ابر می‌شود و بالا می‌رود و باران می‌شود و پایین می‌آید و به شکل رود درمی‌آید و یخ می‌بندد و باز می‌شود و مدام چهره عوض می‌کند تا بگوید چیز جدیدی شده، فریبت نمی‌دهد و ادای نو بودن در نمی‌آورد. زیرزمین و دور از آفتاب، خاک و سنگ کهنه‌گی ازلی‌ و ابدی‌اش را در هر وجب جلوی صورتت نمایش می‌دهد.شش«گفتند: داروي دل چيست؟گفت: از مردمان دور بودن.»همیشه به آنهایی که می‌توانند تنها باشند و از بقیه دور بمانند حسودی می‌کنم. به آنهایی که دلتنگ نمی‌شوند، به آن‌هایی که مشغول کار خودشان هستند، اگر بقیه دور و اطرافشان بودند از حضورشان لذت می‌برند، اگر هم یک روز رفتند و کسی نبود برایشان مهم نیست. از هر چه که رنگ تعلق داشته باشد آزادند. من نمی‌توانم. برای همین است که چشم‌هایم را می‌بندم و فکر می‌کنم صدها متر زیر زمین تنها دور از همه چیز هستم. زمین واقعیت را کندن به مراتب سخت‌تر است. ولی حتی اگر می‌توانستم هم تازه قسمت آسان ماجرا بود، بخش سخت‌تر وقتی است که باید برگردی بالا و «کُن فی‌الناس» ولی «لا تکن مَعَهم». این را حتی در خیال هم نمی‌توانم تصور کنم. ترجیح می‌دهم فعلا همینجا بمانم.</description>
                <category>Sajjad Reyhani</category>
                <author>Sajjad Reyhani</author>
                <pubDate>Tue, 22 Oct 2024 22:46:08 +0330</pubDate>
            </item>
                    <item>
                <title>در انتظار مرگ</title>
                <link>https://virgool.io/MePlusBook/%D8%AF%D8%B1-%D8%A7%D9%86%D8%AA%D8%B8%D8%A7%D8%B1-%D9%85%D8%B1%DA%AF-fyymsfnjr4gs</link>
                <description>از پشت جلد: مردن یکی از نخستین داستان‌های روانکاوانه‌ی ادبیات آلمانی‌زبان به شمار می‌رود و نیز از نخستین آثار شنیتسلر، نویسنده‌ای که بعدها او را تالی زیگموند فروید دانستند.مردن کتابی‌ است درباره مرگ (duh!)، البته نه در مورد خود مرگ، بلکه انتظار مرگ. مرگی معین شده و مهلت‌‌دار. مرگی که می‌‌دانی کی‌ منتظرت است و چند روز از زندگی‌ات باقی‌مانده. همه می‌‌دانیم که قرار است بالاخره بمیریم ولی کمتر کسی هست که در تصمیماتش برای آینده، در کارهای روزانه‌ش و غرق فکر شدن‌‌های شبانه‌‌اش به این فکر کند که سال بعد قرار نیست زنده باشد. شخصیت اصلی این داستان «فلیکس» اما می‌‌داند. فلیکس به بیماری درمان‌ ناپذیری مبتلا شده است و مدتی کمتر از یک سال برای زندگی کردن در اختیار دارد. فلیکس به تازگی با «ماری» نامزد کرده است. ماری که عاشق و دل‌‌داده است با شنیدن این خبر جا نمی‌زند. همچنان دوست‌ دارد که در کنار فلیکس بماند و از او مراقبت کند. زندگی بدون معشوق را نمی‌‌‌‌تواند تحمل کند و حاضر است در کنار فلیکس به زندگی خودش هم پایان دهد. فلیکس طبیعتا به او اصرار می‌‌کند که همنشینی با این جسد متحرک را ترک کند و تا فرصت دارد به زندگی خودش برسد. واکنش هر دو تا اینجا طبیعی به نظر می‌‌رسد.     ماری ناگهان با دو چشم درشت و عاری از اشک سر بلند کرد. به سرعت به طرف فلیکس رفت، با هر دو دست او را بغل کرد و به سینه فشرد. با صدایی فروخورده گفت: «می‌خواهم کنار تو بمیرم.» فلیکس لبخند زد. «این حرف‌ها بچگانه است. من آن قدرها که تو فکر می‌کنی از خودراضی نیستم. حق هم ندارم تو را به دنبال خودم بکشم.»    «من بدون تو نمی‌توانم زندگی کنم.»     «چه مدت بدون من زندگی کردی؟ یک سال پیش که با تو آشنا شدم، از دست رفته بودم. خودم نمی‌دانستم، ولی همان موقع هم حس می‌کردم.»     «حالا هم نمی‌دانی.»     «چرا می‌دانم. به همین دلیل هم آزادت می‌گذارم که ترکم کنی.»هرچه داستان جلوتر می‌‌رود می‌‌بینیم که چطور رفتار هر دو کاملا برعکس می‌‌شود. زوج عاشق بعد فهمیدن خبر به مسافرت می‌‌روند و مدتی سرخوش و راحت‌ از هر مسئولیتی خوش‌ می‌گذارنند، مریضی فلیکس به مرور تشدید می‌‌شود و به مرور لذت‌‌های دنیا در نظرش پوچ و بیهوده می‌‌شود. ماریا شب و روز مشغول مراقبت از وضع بیمار اوست، حالا دیگر احساساتش فروکش کرده‌اند و غریزه زندگی‌‌ا‌ش کنترل را در دست می‌گیرد. هنوز جوان است و عمر درازی در پیش دارد. چرا در کنار مردی که نه از قدم زدن در باغ بهاری لذت می‌برد نه از آواز و رقص خیابانی، باید بماند و تباه شود؟ از طرف دیگر فلیکس روز به روز آشفته‌‌تر می‌‌شود،  فکر اینکه ممکن است ماریا به قولش وفادار نماند و همراه مرگ او خودکشی نکند همه‌‌ی ذهنش را در چنگ گرفته‌است. نویسنده توضیحی نمی‌‌دهد که این وسواس جنون‌‌آمیز از کجا ریشه می‌گیرد. شاید می‌‌خواهد انتقام این بلای آسمانی را که ناگهانی بر سرش نازل شده از معشوقش بگیرد و یا حداقل در این تراژدی شریکی داشته باشد. چرا او باید به این زودی بمیرد ولی کسی که قول داده بودند تا آخر عمر با هم باشند زنده بماند و فرصت دوباره عاشق شدن داشته باشد؟ نقاشی «ترس» را فلیکس نوسبام، در سال ۱۹۴۱ در بروسل از خودش در حالتی که صورت خواهرزاده‌اش را گرفته و بمب‌افکنی در آسمان بالای سرشان پرواز می‌کند کشیده است. فارغ از کانتکست نقاشی، انتخاب معرکه‌ای برای طرح جلد است و کاملا حال و هوای زوج داستان را منتقل می‌کند.      یک شب آلفرد در حالی از راه رسید که فلیکس کتابی از شوپنهاور را روی پتوی تختخواب انداخته بود و با چهره‌ای درهم به پیش روی خود نگاه می‌کرد. ماری کنار تخت سرگرم دوخت و دوز بود.     فلیکس با حالتی تقریباً عصبی رو به تازه وارد گفت: «آلفرد، می‌دانی؟ خیال دارم باز رمان بخوانم.»    «چه اتفاقی افتاده؟»    «رمان‌ها لااقل در داستان پردازی صادقانه‌اند. خوب یا بد، اثر نویسنده‌ای هنرمند یا تازه کار. اما این آقایان، و با نگاه به کتاب روی تخت اشاره کرد، اینها فقط خودنما و رذل‌اند.»«اوه!»    فلیکس کمر راست کرد و توی تخت نشست. «تحقیر زندگی وقتی آدم مثل یک رب النوع تندرست است؛ چشم در چشم مرگ دوختن، وقتی که در ایتالیا گردش می‌کنی و زندگی با شاداب‌ترین رنگ‌ها در اطرافت گسترده استـ بله، چنین چیزی از نظر من جز خودنمایی چیزی نیست. ولی یکی از این آقایان را توی اتاق حبس کن، تب و نفس‌تنگی به جانش بینداز، بهش بگو در فاصله‌ی اول ژانویه تا اول فوریه سال بعد خواهد مُرد، بعد ازش بخواه برایت فلسفه‌بافی کند.»رمان کوتاه است و متمرکز بر این واقعه و اطلاعات زیادی در مورد خود شخصیت‌‌ها داده نمی‌شود. نمی‌دانیم فلیکس چه‌کاره بوده است. خانواده‌اش در این مدت کجا هستند و چه می‌کنند. رابطه فلیکس و ماریا هیچ گذشته‌ای ندارد، حتی نمی‌دانیم فلیکس به چه بیماری‌ای مبتلا شده است. جزییاتی که شاید دانستنشان می‌توانست شناخت ذهن این دو نفر را جذاب‌تر کند.کمی بی‌ربط و با ربط: مدتی‌‌ست که سریال پزشکی-معمایی House M.D را می‌بینم و هر چند اپیزود یک‌بار سر و کله بیمار سرطانی‌ای که به او گفته شده فلان مدت بیشتر زنده نمی‌مانی پیدا می‌شود. هر کدامشان مواجه متفاوتی با این خبر دارند، برخی سعی می‌کنند از مدت زمان باقیمانده بهترین استفاده را بکنند و از زندگی لذت ببرند. یک مورد فردی بود که تشخیص سرطان بدخیم داشت و خانه و زندگی‌اش را فروخته بود و برنامه مسافرت برای کشورهای مختلف و تجربه‌های متفاوت چیده بود اما دکتر معالجش بعد از چند ماه متوجه می‌شود که در فرآیند تشخیص خطایی رخ داده و مریض سرطان ندارد و حالا حالاها قرار است به زندگی ادامه دهد.دکتر با خوشحالی این خبر را به او می‌دهد اما واکنش مریض خشم و عصبانیت است. خشم از اینکه موهبت زندگی در لحظه و لذت بردن از آن را از دست داده و باز باید به روال خسته کننده و کسالت‌بار زندگی بدون ددلاین سابقش بازگردد.</description>
                <category>Sajjad Reyhani</category>
                <author>Sajjad Reyhani</author>
                <pubDate>Sun, 31 Mar 2024 03:12:05 +0330</pubDate>
            </item>
                    <item>
                <title>ساختن Custom Collection در Swift</title>
                <link>https://virgool.io/coderlife/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-custom-collection-%D8%AF%D8%B1-swift-ywh89wc90ebh</link>
                <description>*این مطلب به همراهی مهدی حاجی محمدعلی و به عنوان تحقیق درس برنامه سازی موبایل، و از روی این منبع  نوشته شده است.معمولا آرایه‌ها، مجموعه‌ها و دیکشنری‌ها، کالکشن‌تایپ هایی هستند که در کتابخانه استاندارد سوییفت وجود دارند و از‌ آنها استفاده می‌شود، اما اگر این‌ها نیاز شما را برطرف نکنند چطور؟ می‌توانید کالکشن دلخواه خودتان را با پیاده سازی پروتکل‌هایی که در کتابخانه استاندارد سوییفت وجود دارند، بسازید.در این آموزش ما میخواهیم یک (multiset(Bag بسازیم. از این بعد آنرا سبد صدا میزنیم.مقدمات کاربا کد زیر شروع می‌کنیمبرای اینکه ورودی مجموعه را بتوانیم در (O(1 مقایسه کنیم و ذخیره کنیم نیاز داریم تا ورودی از جنس Hashable  باشد.چون میخواهیم مانند مجموعه‌های استاندارد سوییفت valueType باشد از struct استفاده میکنیم.یک سبد دقیقا مشابه set هست و اگر عنصر تکراری به آن اضافه شود آنرا جدا نگه نمیدارند اما تعداد تکرار یک عنصر را ذخیره میکند، برای مثال لیست خرید نمونه‌ای از یک سبد است که هر مورد در آن تعداد هم دارد.برای پیاده‌سازی این ویژگی، کد زیر را اضافه میکنیمبرای ذخیره تعداد برای هر عنصر از دیکشنری (content) استفاده میکنیم.آنرا fileprivate قرار میدهیم تا خارج از کد ما دسترسی نداشته باشد.تعداد عناصر یکتا یا همان سایز مجموعه را در uniqueCount نگه میداریم.تعداد کل عناصر را - با احتساب تکراری ها - در totalCount نگه میداریم.اضافه کردن تابع Add۱.تابع (:add(_:occurrences :  این تابع ورودی memeber که از تایپ جنریک Element است را به همراه ورودی آپشنال occurrences میگیرد و به تعداد occurences ، آنرا به سبد ما اضافه میکند.از کلیدواژه mutating هم استفاده میکنیم تا بتوانیم مقدار contents را داخل تابع تغییر دهیم.۲.تابع precondition: در طول برنامه برای اطمینان از صحت عملکرد برنامه استفاده میشود. این تابع یک شرط و یک رشته به عنوان ورودی میگیرد. اگر شرط برقرار بود برنامه ادامه می‌یابد و اگر شرط برقرار نبود برنامه متوقف شده و رشته چاپ می‌شود.۳. اگر آیتم وجود داشت تعداد آنرا به اندازه مقدار داده شده زیاد میکند و اگر وجود نداشت آنرا به دیکشنری contents اضافه می‌کند.پیاده سازی تابع Removeاین تابع هم ۲ ورودی مانند تابع add میگیرد.در قسمت ۱ چک میکند که آیتم به مقدار حداقل به مقداری که قرار است کم بشود، وجود داشته باشد. اگر نبود از تابع خارج می‌شود.۲.مطمئن می‌شود که مقدار حذفی حتما عددی مثبت باشد. ۳. اگر موجودی آیتم بیشتر از مقدار برای کم کردن بود آنرا کم میکند در غیر این‌ صورت آیتم را کلا حذف می‌کند.حالا سبد ما صرفا قابلیت اضافه مردن و کم کردن دارد ولی ما میخواهیم امکان iterate,filter,map ,... هم داشته باشد. برای اضافه کردن این قابلیت ها باید تعدادی از پروتکل‌های سوییفت را پیاده‌سازی کنیم.پیاده‌سازی پروتکل‌هاپروتکل‌ها در سوییفت مجموعه‌ای از توابع و متغیر ها هستند که شی استفاده کننده از این پروتکل باید آنها را پیاده‌سازی کند.( مانند interface در جاوا). برای استفاده از پروتکل (adopt) بعد از نام کلاس در تعریف، دونقطه قرارداده و اسم پروتکل را جلوی آن مینویسیم.بعد از تعریف باید خصوصیات و توابع پروتکل را پیاده‌سازی کرد.برای مثال، در حال حاضر صورت رشته‌ای سبد ما اطلاعات خاصی به ما نمیدهد. اگر قطعه کد زیر را اجرا کنید و نتیجه را در دیباگر مشاهده کنید میبینید که شی سبد صرفا به صورت &lt;Bag&lt;String نمایش داده می‌شود.برای حل این مسئله، پروتکل CustomStringConvertible را به کلاسمان الحاق میکنیم.این پروتکل متغیری به نام describtion دارد که مقدار آن را برابر صورت رشته‌ای دیکشنری content قرار میدهیم. کلاس دیکشنری، خودش این پروتکل را به صورتی پیاده سازی کرده که با تبدیل دیکشنری به رشته، محتوای داخل دیکشنری به صورت رشته دربیاید. حالا اگر دوباره کد تستیمان را اجرا کنیم میبینم که در هر مرحله محتوای داخل سبد به صورت رشته نمایش داده می‌شود.ساختن initializerدونه دونه اضافه کردن اعضا به سبد سخته، پس می‌خواهیم قابلیتی فراهم کنیم که موقع ساختن سبد، یک کالکشن دریافت کنه  و همه رو اضافه بکنه.برای مثال ما انتظار داریم که کد زیر کار بکند.برای اینکه کد بالا کار بکند باید برای سبد، initializer مناسب را تعریف کنیم.پس کد زیر را اضافه میکنیم:برای اینکه بتونیم initializer های مختلف با ورودی ها اضافه بسازیم اول باید یک تابع init خالی بگذاریم.یک initializer تعریف میکنیم که به عنوان ورودی هر شئ‌ای که پروتکل Sequence را پیاده کرده باشد و اشیاء داخلش از جنس اشیاء داخل سبد ما باشد را به عنوان ورودی می‌گیرد و بعد آنرا پیمایش کرده و اشیاء آن را به سبد ما اضافه می‌کند. یک initializer  دیگر هم مانند قبلی اضافه می‌کنیم با این تفاوت که اینجا ورودی ما tuple از جنس (Element,Int) است و مثلا به عنوان ورودی می‌تواند یک دیکشنری از اشیاء را همراه با تکررشان به سبد اضافه کند. حالا می توانید کدی که گذاشته بودیم را اجرا کنیم.ساختن مستقیم با کالکشناین initializer هایی که ساختیم به ما امکانات بیشتری برای ساخت سبد می‌دهد، اما همچنان نیاز داریم تا برای ساختن سبد یک کالکشن بسازیم و آنرا به تابع سازنده سبد بدهیم. اما اگر بخواهیم با شکل مستقیم آرایه یا دیکشنری، سبدمان را بسازیم چطور؟ مثلا کد زیر مثالی از ساختن سبد به همین شیوه است.برای اینکه کد بالا اجرا شود باید پروتکل های ‌ExpressibleByArrayLiteral  و ExpressibleByDictionaryLiteral را به شیوه زیر پیاده سازی کنیم.این دو پروتکل از دو شکل مستقیم آرایه و دیکشنری استفاده می‌کنند و با تابع سازنده‌ای که قبلا نوشته بودیم سبد ما را می‌سازند.اما Custom Collection واقعا چیست؟حالا که جلو آمده‌ایم می‌توانیم بهتر بفهمیم که کاستوم کالکشن چیست.یک شئ مجموعه‌ای است که هر دو پروتکل Collection  و Sequence را پیاده‌سازی می‌کند.در قسمت قبل تابع  initializer ای تعریف کردیم که به عنوان ورودی شیئی که Sequence را پیاده کرده باشد می‌گرفت. Sequence معرف داده‌ای است که قابلیت پیمایش روی داده‌هایش را به ما می‌دهد.پیمایش مفهموم ساده‌ای است اما قابلیت‌های مهمی را به داده ما می‌دهد.مثلا عملیات های زیر با پیاده کردن Sequence فراهم می‌شود:تابع map(_:) بر روی هر کدام از داده‌های داخل مجموعه عملیاتی را انجام می‌دهد و نتیجه را برمی‌گرداند.تابع filter(_:) قسمتی از داده‌ها‌ را که با شرط داده شده مطابقت دارند را برمی‌گرداند. تابع (:‌sorted(by داده‌ها را بر اساس تابع داده‌شده مرتب می‌کندبرای دیدن بقیه توابعی که به وسیله Sequence فراهم می‌شوند داکیومنت آن را ببینید.برای اینکه مطمئن بشویم پیمایش ما بر روی داده‌ها آن را خراب نمی‌کند.از آنجایی که Sequence این مسئله را تضمین نمی‌کند باید پروتکل Collection را هم حتما پیاده کنیم.Collecton از Indexable و Sequence ارث‌ میبرد.پیاده کردن Collection تعدادی تابع و متغیر به دردبخور را مجانی در اختیار شما می‌گذارد:بولینی که نشان میدهد کالکشن خالی‌ است یا نه: isEmptyاولین عضو را برمیگرداند: firstتعداد اعضای مجموعه را برمی‌گرداند: countتعدادی دیگر هم هست که می‌توانید در داکیومنت آن ببینید.حالا سبدتون رو بردارید تا این پروتکل هارو پیاده‌سازی کنیم :)مطابقت دادن با sequenceتنها کد بالا برای مطابقت لازم است. در کد بالا:۱. یک typealias به نام iterator که از نوع DictionaryIterator میباشد ساخته‌ایم. Sequence برای دانستن نحوه iterate کردن ما به آن نیاز دارد. DictionaryIterator تایپی است که اشیا از جنس دیکشنری از آن برای iterate کردن استفاده می‌کند. ما از این تایپ استفاده می‌کنیم زیرا سبد داده‌های اصلی خود را در یک دیکشنری ذخیره می‌کند.۲. یک makeIterator تعریف می‌کنیم که یک iterator را برای حرکت روی هر عنصر sequence خروجی می‌دهد.۳. داخل تابع makeIterator یک iterator روی contents می‌گیریم. خود contents نیز با sequence مطابقت دارد.این همه آن چیزی است که برای ساختن یک سبد مطابق با sequence نیاز داریم.حال می‌توانیم روی هر یک از عناصر سبد حرکت کنیم و تعداد هر شی را به‌دست آوریم. کد زیر را به انتهای playground پس از for-in قبلی اضافه می‌کنیم:حال با اجرای playground می‌توانید هر عنصر سبد و تعداد آن را ببینید.مشاهده برخی مزایای sequenceحرکت روی عناصر سبد امکان پیاده‌سازی توابعی سودمند در sequence را به ما می‌دهد. کد زیر را در پایان playground اضافه کنید تا برخی از مزایای این اتفاق را مشاهده کنید:برنامه را اجرا کنید.می‌توانید چندی از این توابع را در بالا ببینید.حال می‌توان امکانات بیشتری به sequence افزوده و پیاده‌سازی آن را بهتر کنید. در ادامه به پیاده‌سازی بهتر sequence می‌پردازیم:بهینه‌سازی sequenceدر حال حاضر ما تمام دیتاهای اساسی‌مان را روی یک دیکشنری نگه‌میداریم و آن را کنترل می‌کنیم. این ویژگی خوبی است زیرا می‌توانیم بوسیله آن کالکشن مورد نظرمان را به سادگی درست کنیم. ولی مشکل ما این است که این مساله کاربرانی که از سبد استفاده می‌کنند را گیج می‌کند. زیرا اینکه سبد به ما یک iterator از نوع dictionaryiterator می‌دهد چندان درست به‌نظر نمی‌رسد.ولی سوییف این مشکل را به راحتی برای ما حل می‌کند. سوییف از تایپ AnyIterator نیز پشتیبانی می‌کند که به‌سیله آن می‌توانیم هویت iterator اصلی را از باقی کد پنهان نگه داریم.پیاده‌سازی sequence extension را به‌صورت زیر تغییر دهید:با این تغییرات روی Sequence extension:۱. یک iterator از نوع any را به‌جای dictionary استفاده کردیم. سپس همانند قبل می‌توانیم تابع makeIterator را روی تعریف کنیم تا آن را به ما خروجی دهد.۲. همانند قبل یک iterator را با فراخوانی تابع makeIterator روی content بدست می‌آوریم.۳. حال iterator را بصورت یک شی AnyIterator خروجی می‌دهیم. این شی از طریق تابع next روی iterator قسمت قبل می‌تواند روی دیتای ما حرکت کند. حال این شی را خروجی می‌دهیم.حال اگر کد را اجرا کنید با خطاهایی مواجه می‌شوید:پیش از این ما از DictionaryIterator با دوتایی های key , value استفاده می‌کردیم. حال این شی را تغییر داده‌ایم و نام های دوتایی را به element : count تغییر داده‌ایم. در نتیجه برای حل این خطا key , value را با element, count جایگزین می‌کنیم. حال با اجرای برنامه precondition های شما pass می‌شود.حال کسی متوجه استفاده ما از dictionary نمی‌شود. حال زمان پیاده‌سازی collection می‌باشد…استفاده و پیاده‌سازی Collection protoclبرای پیاده‌سازی کالکشن باید Colection protocol را پیاده‌سازی کنیم. کالکشن یک sequence است که به عناصر آن بوسیله یک اندیس می‌توان دسترسی پیدا کرد و روی آن چندین بار حرکت کرد.برای پیاده‌سازی کالکشن باید جزییات زیر را در نظر بگیریم:۱. اندیس شروع و پایان: که کران‌های کالکشن را مشخص می‌کند و نقطه شروع عرض را مشخص می‌کند.۲. Position: این امکان را به ما می‌دهد که به هر عنصر کالکشن با یک اندیس دسترسی پیدا کنیم. عملیات دسترسی نیز باید با در (1)O انجام شود.۳. اندیس: اندیس را به محض اندیس پاس شده بازگرداند.کد زیر را پایین sequence extension قرار دهید:در این قسمت:۱. نوع اندیس در کالکشن از نوع dictionaryindex تعریف می‌شود. ما این اندیس را از طریق content پاس می‌دهیم.۲. اندیس شروع و پایان content را خروجی می‌دهیم.۳. از یک precondition برای بدست آوردن اندیس های معتبر استفاده می‌کنیم. مقدار عنصر content متناسب با اندیس را به صورت یک تاپل باز می‌گردانیم.۴. مقدار index(after) of content را باز می‌گردانیم.با افزودن این توابع و مقادیر کالکشن به درستی ساخته می‌شود.آزمایش کالکشنکد زیر را به انتهای playground اضافه کنید تا عملکردهای جدید را آزمایش کنید:حال دوباره playground را اجرا کنید.حال نشانه هایی از dictionary در کد دیده می‌شود. پس به بهینه کردن کد می‌پردازیم:بهینه‌سازی کالکشنحال باید DictionaryIndex را از کد مان حذف کنیم. به صورت زیر می‌توان این مساله را حل کرد:در تکه کد بالا:۱. یک تایپ جدید به نام bagindex تعریف می‌کنیم. همانند سبد این تایپ نیز باید قابل hash شدن باشد تا در دیکشنری قابل استفاده باشد.۲. داده داخلی برای این نوع اندیس را یک شی از نوع dictionaryIndex قرار می‌دهیم.۳. یک initializer تعریف میکنیم که یک شی از DictionaryIndex را بگیرد و ذخیره کند.حال باید توجه کنیم که کالکشن ایندکس قابل مقایسه نیاز دارد تا بتواند عملیات‌های مورد نیاز را با توجه به تفاوت اندیس‌ها انجام دهد. با توجه به این BagIndex باید comparable را پیاده‌سازی کند.کد زیر را پس از bagIndex قرار دهید:منطق این کد واضح است. از توابعی همانند dictionaryIndex استفاده می‌کنیم تا مقدار درست را خروجی دهیم.به‌روز کردن BagIndex:حال باید Bag را تغییر داده و از bagindex استفاده کنیم. حال تکه کد زیر را با collection extension جایگزین کنید:هر یک از اعداد کامنت شده در کد بالا یک تغییر را نشان می‌دهد. به تفصیل این تغییرات می‌پردازیم:۱. تایپ اندیس(index) از dictionaryindex به bagindex تغییر داده ایم.۲. یک bagindex را در content برای startindex و endindex می‌سازیم.۳. از متغیر index داخل bagindex استفاده می‌کنیم تا به هر عنصر از contentsدسترسی پیدا کرده و آن را بازگردانیم.۴. مقدار Dictionaryindex را از contents بوسیله مقدار bagindex میگیریم و یک bagindex جدید با این مقدار ایجاد می‌کنیم.حال توانستیم کاری کنیم که کاربران از استفاده ما از دیکشنری باخبر نشوند.حال برای آنکه کار را به اتمام برسانیم بهتر است امکان انتخاب یک بازه را بوسیله slice به کاربر بدهیم.استفاده از sliceقسمت یا slice یک زیرمجموعه‌ای از عناصر داخل کالکشن می‌باشد و این امکان را می‌دهد تا روی یک زیرمجموعه از کالکشن تغییراتی اعمال کنیم بدون آن که نیاز به کپی کردن از عناصر داشته باشیم.هر slice یک رفرنس به کالکشن اصلی را نگه می‌دارد. Slice ها اندیس‌ها را با کالکشن ابتدایی خود به اشتراک گذاشته و یک رفرنس یا اشاره به اندیس شروع و پایان آن بازه خواهند داشت تا زیرمجموعه مورد نظر را تحت نظر داشته باشد. Slice ها پیچیدگی زمانی ثابت (۱)O دارند زیرا بصورت مستقیم به کالکشن اصلی خود اشاره می‌کنند.برای متوجه شدن نحوه عملکرد آنها کد زیر را به انتهای playground اضافه کنید:۱. یک سبد میوه از ۴ میوه مختلف ساختیم.۲. اولین نوع از میوه را حذف می‌کنیم. این‌کار یک slice جدید بوجود می‌آورد که میوه نوع اول را جدا می‌کند به جای آنکه یک شی سبد جدید را ایجاد کنید.۳. اندیس آخرین میوه باقی‌ماده را می‌یابد.۴. نه تنها اندیس را از کالکشن اصلی می‌گیریم تا به یک عنصر آن دسترسی پیدا کنیم بلکه اندیس را از slice محاسبه می‌کنیم.خب دیگه تموم شد. تونستیم یک کالکشن برای خودمون بسازیم:)</description>
                <category>Sajjad Reyhani</category>
                <author>Sajjad Reyhani</author>
                <pubDate>Fri, 07 Aug 2020 18:03:09 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی کتاب: &quot;ارباب کمان نقره‌ای&quot;</title>
                <link>https://virgool.io/ketabaz/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%AA%D8%A7%D8%A8-%D8%A7%D8%B1%D8%A8%D8%A7%D8%A8-%DA%A9%D9%85%D8%A7%D9%86-%D9%86%D9%82%D8%B1%D9%87%D8%A7%DB%8C-revph4qg2qqi</link>
                <description>این کتاب را به درخواست دوستی که فرصت نمی‌کرد به نمایشگاه کتاب برود و گفته بود :«به سلیقه خودت یه کتاب فانتزی برام بگیر.» خریدم و عامل اصلی خریدش هم قیمت پایین(چاپ قدیم بود) و حجم زیاد بود! این کتاب اولین تجربه من از دیوید گمل بود و بعدش افسوس خوردم که چرا زودتر با این نویسنده آشنا نشدم.داستان در فضای یونان باستان و در بستر شخصیت های حماسه ایلیاد و اودیسه روایت می شود اما خط داستانی جدید و متفاوتی را بیان می‌کند و عمدتا روایت زندگی هلیکون،شاهزاده داردانیا است.جنگجوی نیرومندی که با تصمیمات بزرگ و موقعیت های مهمی در زندگی خود روبرو می شود.[مگر همه ی ما نمیشویم؟] اشتباه نکنید، قرار نیست او به قهرمان محبوب داستان تبدیل شود، او نیز مانند همه انسان ها دچار لغزش می شود و درست جایی که انتظارش را ندارید نیمه تاریک خود را نشانتان میدهد. کتاب علی رغم تصور اولیه ای که از آن داشتم فانتزی نیست و در آن خبری از ساتیرها، سانتور ها ، فیری ها و ... نیست. مدوسا و مینوتور را صرفا در داستان سرایی  نقال‌ها؛ و الهه ها و خدایان را فقط در دعا ها و قسم ها میتوانید پیدا کنید. بنابراین فکر میکنم این داستان بیشتر در دسته ی حماسی قرار میگیرد تا  فانتزی.اینطور که با جست و جو در اینترنت ( بعد از مطالعه ی کتاب) متوجه شدم. ظاهرا این کتاب قسمت اول از یک سه گانه به نام تروا است و متاسفانه ناشر در طرح جلد و اطلاعات کتاب کوچکترین اشاره ای به این موضوع  نکرده.البته که داستان در همین قسمت به سرانجام میرسد و این موضوع صدمه ای به تجربه ی شما نخواهد زد.توضیحات پشت جلد:سه نفر سرنوشت ملت ها را تغيير مي دهند.هليکون، شاهزاده جوان درناي، تسخير شده توسط خاطرات تلخ و عذاب آور دوران کودکي. کاهنه آندروماک، با روحيه اي آتشين و استقلال طلب که اقتدار پادشاهان را به چالش مي طلبد.و آرگوريوس،جنگجوي تنها و منزوي، که فقط فکر انتقام او را به پيش مي برد. آن ها تروا را شهري مي يابند ويران شده ي کينه و رقابت، و پشت ديوارهاي سر به فلک کشيده ي اين ويرانه  دشمنان تشنه به خوني را که چشم به ثروت آن دوخته و نقشه سقوطش را مي کشند.</description>
                <category>Sajjad Reyhani</category>
                <author>Sajjad Reyhani</author>
                <pubDate>Mon, 27 Jul 2020 21:46:23 +0430</pubDate>
            </item>
            </channel>
</rss>