Codeit Mobile
94 subscribers
3 photos
1 video
243 links
📱 آموزش برنامه‌نویسی موبایل

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
گاهی اوقات حس می‌کنی یه کلاس جاوا یا کاتلین کمبود یه تابع خاص رو داره و مجبوری کد تکراری بنویسی. راه حلش «Extension Functions» هست؛ بدون ارث‌بری یا تغییر کلاس اصلی، بهش تابع جدید اضافه کن. 😎

«Extension Functions» در کاتلین بهت اجازه می‌دن توابعی تعریف کنی که انگار جزو خود کلاس هستن، ولی در واقع بیرون از کلاس نوشته می‌شن. این کار کدت رو ماژولارتر و خواناتر می‌کنه.

🔧 فرض کن می‌خوای به کلاس «String» یه تابع اضافه کنی که کلمات یه جمله رو معکوس کنه. این میشه یه «Extension Function» ساده و پرکاربرد.

کد این تابع رو با یه خط معرفی می‌کنم:

fun String.reverseWords(): String {
return this.split(" ").reversed().joinToString(" ")
}


توضیح کد: تابع «reverseWords» به کلاس «String» extend شده. با «this» به خود رشته دسترسی داری. کلمات رو جدا می‌کنه، برعکس می‌کنه و دوباره بهم می‌چسبونه.

حالا می‌تونی هر جایی از کدت مثل یه تابع اصلی ازش استفاده کنی:

val result = "سلام دنیا".reverseWords()
println(result) // خروجی: دنیا سلام


این تکنیک مخصوصاً برای کلاس‌های سیستمی مثل «List», «Map» یا حتی «Context» خیلی به کار میاد و حجم کدهای تکراری رو کاهش میده.

نتیجه‌گیری: با «Extension Functions» دیگه نیازی به نوشتن توابع ابزاری جداگانه نداری. کدت خواناتر، تمیزتر و حرفه‌ای‌تر می‌شه. همینه که کاتلین رو دوست‌داشتنی می‌کنه. ❤️

#Codeit #Android #Kotlin #Jetpack #ExtensionFunctions #CleanCode #ProgrammingTips #KotlinTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔰 اولین مشارکت در پروژه‌های اوپن‌سورس رو از کجا شروع کنیم؟ 🤔

خیلی از برنامه‌نویس‌ها می‌خوان وارد دنیای متن‌باز بشن، ولی سردرگم‌اند. نگران نباشید، جای درستی اومدید! 🚀

اول از همه، به‌دنبال پروژه‌ای بگردید که واقعاً باهاش ارتباط برقرار کنید. مثلاً یه ابزاری که خودتون استفاده می‌کنید یا یه کتابخونه‌ای که توی پروژه‌هاتون به کار می‌برید.

دنبال «Good First Issue» یا «Help Wanted» بگردید. اکثر پروژه‌های معروف مثل «Kotlin» یا «Jetpack Compose» چنین برچسب‌هایی دارن.

نیازی نیست حتماً کد بنویسید! می‌تونید با مستندات شروع کنید… ترجمه، ویرایش تایپوها یا به‌روزرسانی راهنماها. این هم یه مشارکت ارزشمنده 😎

یه راه عالی دیگه: باگ‌های ساده رو برطرف کنید. مثلاً یه «NullPointerException» کوچیک یا یه مشکل در UI. این کار اعتمادبه‌نفستون رو بالا می‌بره.

قبل از ارسال اولین «Pull Request» حتماً «CONTRIBUTING.md» رو بخونید. هر پروژه قوانین مخصوص خودش رو داره.

از جامعه نترسید! توی «Issues» سؤال بپرسید، توی «Discussions» مشارکت کنید. توسعه‌دهنده‌های باتجربه معمولاً خوش‌برخورد هستن.

شروع کنید با پروژه‌های کوچیک و کم‌ریسک. کمکم که تجربه کسب کردید، می‌تونید سراغ مشارکت‌های سنگین‌تر برید.

🎯 نکته نهایی: اوپن‌سورس فقط کدنویسی نیست، یه فرصت طلایی برای یادگیری، شبکه‌سازی و ساختن رزومه‌ست. اولین قدم رو امروز بردارید! 💪

#Codeit #OpenSource #Android #Kotlin #Jetpack #FirstPR #DeveloperJourney
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
توی کاتلین، می‌تونی بدون تغییر کلاس اصلی، بهش پراپرتی اضافه کنی!
این کار با «Extension Properties» انجام می‌شه.

🔹 اگه تا حالا از «Extension Functions» استفاده کردی، پراپرتی‌های الحاقی هم دقیقاً همون مفهوم رو برای پراپرتی‌ها دارن.
🔸 به زبان ساده: به کلاس‌های از پیش موجود (مثل String، View، List) یه پراپرتی جدید اضافه می‌کنی بدون اینکه ارث‌بری کنی.

💡 مثال کاربردی: فرض کن می‌خوای همیشه طول یه رشته رو به‌صورت مستقیم بگیری.
به‌جای每次都 نوشتن str.length، یه پراپرتی به اسم lengthInKm (مثلاً برای نمایش) تعریف می‌کنی.

کد ساده برای اضافه کردن پراپرتی الحاقی به کلاس String:

val String.isLong: Boolean
get() = this.length > 10


📌 توضیح: این پراپرتی به تمام رشته‌های کاتلین اضافه می‌شه. هر وقت بنویسی "Hello".isLong، خروجی false برمی‌گرده چون طولش ۵ تاست.
فایده‌ش اینه که کد خواناتر می‌شه و نیازی به توابع کمکی جداگانه نداری.

🚀 کاربردی‌تر: توی اندروید، برای ویوها هم می‌تونی پراپرتی اضافه کنی:

val View.isVisible: Boolean
get() = this.visibility == View.VISIBLE


حالا به‌راحتی می‌نویسی: if (button.isVisible) { ... }

🎯 نکته مهم: پراپرتی‌های الحاقی نمی‌تونند فیلد ذخیره‌سازی (backing field) داشته باشند و فقط getter دارند.
اما برای منطق‌های ساده و خوانایی کد عالی هستند.

📱 از این قابلیت توی پروژه‌های «Jetpack Compose» هم استفاده کن؛ مثلاً برای تبدیل Stateها به فرمت دلخواه.

#Codeit #Android #Kotlin #Jetpack #ExtensionFunctions #CleanCode #KotlinTips #MobileDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔍 یکی از پراستفاده‌ترین «Scope Functions» در «Kotlin» تابع «let» است.
اگر با متغیرهای «nullable» سروکار دارید، «let» کمک می‌کند بدون شلوغی کد، عملیات ایمن انجام دهید.

🔄 کاربرد اصلی: وقتی مقدار یک متغیر «nullable» را دارید و فقط در صورت غیر null بودن باید پردازش کنید.
اما «let» فقط برای null-check نیست؛ می‌توانید مقدار خروجی را هم تغییر دهید.

⚙️ مثال واقعی: گرفتن یک متن از کاربر و اگر خالی نبود، آن را به حروف بزرگ تبدیل کنیم.

کد زیر را ببینید:

val userInput: String? = getUserInput()

userInput?.let { text ->
val processed = text.uppercase()
textView.text = processed
processed // return value
}

🔹 در اینجا «let» فقط در صورتی اجرا می‌شود که «userInput» null نباشد.
🔹 داخل «let» به جای تکرار نام متغیر، از «it» یا یک نام دلخواه (مثل «text») استفاده می‌کنیم.
🔹 خروجی «let» آخرین عبارت داخل آن است (اینجا «processed»).

💡 نتیجه عملی: کد خوانا، ایمن و قابل نگهداری‌تر می‌شود.
از «let» برای زنجیره‌ای کردن عملیات روی اشیای nullable هم استفاده کنید.

#Codeit #Android #Kotlin #Jetpack #ScopeFunctions #KotlinTips #CleanCode #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
📱 یک تابع پرکاربرد در «Kotlin» که کد رو خواناتر و کوتاهتر میکنه: «apply»!

🔧 «apply» یک «Scope Function» هست که بهتون اجازه میده بدون تکرار اسم آبجکت، به پراپرتی‌هاش دسترسی داشته باشید و اون رو تنظیم کنید. به‌جای نوشتن چندین خط «obj.prop»، با «apply» همه چیز توی یک بلاک جمع میشه.

🎯 کجا به کار میاد؟ وقتی یک آبجکت جدید میسازید و باید چند تا پراپرتی رو مقداردهی کنید (مثلاً تنظیمات یک View یا یک DTO). «apply» آبجکت رو برمی‌گردونه، پس میتونید زنجیره‌ای استفاده کنید.

💡 مثال واقعی: فرض کنید یک «TextView» دارید و میخواید متن، رنگ و اندازه رو تنظیم کنید. بدون «apply» کد تکراری زیاد میشه. با «apply»:

val textView = TextView(context).apply {
text = "Hello"
textSize = 18f
setTextColor(Color.BLUE)
gravity = Gravity.CENTER
}


🧠 توضیح: داخل بلاک «apply»، «this» همون آبجکته، پس مستقیماً به متدها و پراپرتی‌هاش دسترسی دارید. نتیجه همون آبجکت هست، ولی با مقادیر تنظیم شده. کد خواناتر، کم‌حجم‌تر و خالی از تکرار!

نکته مهم: «apply» رو بیشتر برای مقداردهی اولیه (configuration) استفاده کنید، نه برای عملیات زنجیره‌ای طولانی. اینطوری خوانایی به حداکثر میرسه.

🚀 با «apply» کد خودتون رو حرفه‌ای‌تر کنید، مخصوصاً توی «Jetpack Compose» یا موقع تنظیم «ViewModel».

#Codeit #Android #Kotlin #Jetpack #ScopeFunctions #Apply #CleanCode #AndroidDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
📂 «Portfolio»‌ای که واقعاً استخدامت کند، فقط لیست پروژه نیست.
یک داستان حرفه‌ای از مهارت‌های توست. 🚀

بسیاری از اندروید دولوپرها کلی پروژه می‌سازند اما استخدام نمی‌شوند.
علت؟ «Portfolio» مثل ویترین مغازه است؛ اگر مرتب و هدفمند نباشد، مشتری (کارفرما) رد می‌شود.

نکات کلیدی که «Portfolio» تو رو از بقیه جدا می‌کنه:

۱. کیفیت به جای کمیت – یک پروژه کامل با «Clean Architecture» و تست، بهتر از ده تا پروژه ناقصه.
۲. تمرکز روی مشکلات واقعی – اپلیکیشنی که یه نیاز روزمره رو حل کنه، جذاب‌تر از یه «To‑Do List» تکراریه.
۳. مستندسازی درست – حتماً هر پروژه رو با «README» حرفه‌ای، توضیح معماری و «Screenshots» همراه کن.
۴. حضور در «GitHub» – کد تمیز و «Commit»‌های معنادار نشون‌دهنده نظم ذهنیته.

یکی از بهترین راه‌ها مشارکت در پروژه‌های «Open Source» یا فورک یه «Library» معروف و اضافه کردن قابلیت جدیده.
این کار اعتماد کارفرما رو جلب می‌کنه.

اگر «Portfolio» نداری، همین حالا یکی از اپ‌های روزمره مثل «مدیریت هزینه» یا «یادآور دارو» رو با «Jetpack Compose» و «Room» بساز و تو «GitHub» منتشر کن.

یادت باشه: «Portfolio» نباید صرفاً لینک باشه، بلکه باید نشون بده چطور فکر می‌کنی. 💡

#Codeit #Android #Kotlin #Jetpack #PortfolioTips #CareerGrowth #AndroidDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔹 تابع «run» یکی از کاربردی‌ترین «Scope Functions» در «Kotlin» هست که همزمان دو کار مفید انجام میده: اجرای یک بلاک کد روی یک آبجکت و برگردوندن نتیجه‌ی آخرین عبارت داخل بلاک.

🔸 «run» دو شکل داره: یکی به عنوان extension function روی هر نوعی و دیگری به صورت standalone که مستقیماً صدا زده میشه. تفاوتش با «let» و «apply» اینه که درون بلاک به آبجکت با کلمه‌ی «this» دسترسی داری و در نهایت نتیجه رو برمی‌گردونه.

🔹 کِی به کار میاد؟ وقتی می‌خوایم یک آبجکت رو مقداردهی اولیه کنیم، چند عملیات روش انجام بدیم و در نهایت یک مقدار جدید برگردونیم. مثلاً پر کردن یک آبجکت «User» از دیتابیس و برگردوندن نام کامل کاربر.

🔸 مثال عملی: فرض کن یک کلاس «User» داری که فیلدهای «firstName» و «lastName» داره. می‌خوای ازش یک «String» به صورت اسم کامل بسازی و برگردونی.

کد مربوطه رو ببین:

data class User(var firstName: String? = null, var lastName: String? = null)

fun getFullName(user: User): String {
return user.run {
firstName = "Ali"
lastName = "Rezaei"
"$firstName $lastName" // آخرین عبارت برگردونده میشه
}
}

fun main() {
val user = User()
val fullName = getFullName(user)
println(fullName) // خروجی: Ali Rezaei
}


🔹 داخل «run» با «this» به آبجکت «user» دسترسی داری و می‌تونی مستقیماً فیلدها رو مقداردهی کنی. در نهایت عبارت «"$firstName $lastName"» به عنوان نتیجه برگردونده میشه.

🔸 این تابع برای زمانی عالیه که هم نیاز به تغییر وضعیت آبجکت داری و هم می‌خوای یک خروجی مشخص ازش بگیری.

🎯 نکته مهم: «run» با «with» تفاوت داره: «with» غیرextension هست و آبجکت رو به عنوان آرگومان می‌گیره. ولی «run» معمولاً روی null safety بهتر کار می‌کنه.

خلاصه: از «run» برای زنجیره‌ای از عملیات روی یک آبجکت و برگردوندن نتیجه استفاده کن.

#Codeit #Android #Kotlin #ScopeFunctions #RunFunction #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
در «Kotlin» یکی از کاربردی‌ترین ابزارها برای کاهش کدهای تکراری، توابع Scope هستند. امروز سراغ «with» می‌رویم؛ تابعی که یک شیء را به عنوان receiver در اختیار می‌گذارد و نیازی به تکرار نام آن ندارید. 😎

📌 «with» یک تابع استاندارد است که شیء مورد نظر را به عنوان آرگومان می‌گیرد و داخل بلاک، مستقیماً به اعضای آن دسترسی دارید. خروجی بلاک، مقدار آخرین عبارت خواهد بود.

💡 کجا به کار می‌آید؟ وقتی می‌خواهید چندین عملیات روی یک شیء واحد انجام دهید – مثلاً تنظیمات یک ویو یا پر کردن یک شیء داده – بدون اینکه بارها اسم شیء را بنویسید.

یک مثال عملی: تنظیم یک «TextView» در اندروید:

val textView = findViewById<TextView>(R.id.myTextView)
with(textView) {
text = "سلام دنیا!"
textSize = 18f
setTextColor(Color.BLUE)
visibility = View.VISIBLE
}


🔍 در این کد، «with» به ما اجازه می‌دهد مستقیماً روی «TextView» کار کنیم. داخل بلاک هر بار «textView.» را نمی‌نویسیم. مقدار بازگشتی در اینجا «Unit» است (چون آخرین عبارت «visibility» از نوع «Int» نیست؟ در واقع آخرین «visibility = ...» یک «Unit» برمی‌گرداند). اما اگر بخواهید مقداری برگردانید، می‌توانید.

🌟 نکته: «with» برخلاف «apply» یا «run» یک extension function نیست و receiver را به عنوان آرگومان می‌گیرد. برای مواقعی که یک شیء از قبل دارید عالی است.

📈 در پروژه‌های واقعی، «with» را در ابتدای «Activity» برای پیکربندی گروهی ویوها، یا در «ViewModel» برای تنظیم یک شیء «StateFlow» می‌بینید. استفاده از آن کدتان را خواناتر و حرفه‌ای‌تر می‌کند.

#Codeit #Android #Kotlin #Jetpack #ScopeFunctions #With #KotlinTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔹 تابع «also» در کاتلین مثل یه دستیار عمل می‌کنه که بدون تغییر شیء اصلی، یه عملیات جانبی روش انجام میده 😎
🔹 فرقش با «apply» اینه: «apply» روی خود شیء کار می‌کنه و نتیجه رو برمی‌گردونه، ولی «also» شیء رو همون‌طور بهت پس میده تا بتونی بعدش ادامه بدی.

🔹 مثال واقعی: فرض کن داری یه لیست از کاربران می‌سازی و می‌خوای موقع اضافه کردن هر کاربر، لاگ بگیری و تعدادش رو هم چاپ کنی.

🔹 با «also» می‌تونی این کار رو تمیز و خوانا انجام بدی:

data class User(val name: String, val age: Int)

fun main() {
val users = mutableListOf<User>()

val user = User("Ali", 25).also {
println("Adding user: ${it.name}")
users.add(it)
println("Total users: ${users.size}")
}

println("User created: $user")
}


🔹 کد بالا: اول یه شیء «User» می‌سازه، بعد توی بلاک «also» لاگ می‌گیره و به لیست اضافه می‌کنه، در نهایت خود شیء رو برمی‌گردونه برای استفاده بعدی.
🔹 مزیت: بدون قطع زنجیره عملیات، کارهای جانبی مثل لاگ، ذخیره موقت یا اعتبارسنجی رو انجام می‌دی.

🔹 نتیجه: هر وقت خواستی روی یه شیء عملیات حاشیه‌ای انجام بدی بدون اینکه مقدارش عوض بشه، «also» بهترین انتخابه 🚀

#Codeit #Android #Kotlin #Jetpack #ScopeFunctions #CleanCode #KotlinTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🚀 تنها کد نویسی کافی نیست!
اگه می‌خوای یه «اندروید دولوپر» واقعی باشی، باید روی مهارت‌های نرم هم سرمایه‌گذاری کنی.

🧠 ارتباط مؤثر
بتونی ایده‌هات رو ساده و شفاف به بقیه انتقال بدی. تو تیم‌های حرفه‌ای، کسی که خوب توضیح می‌ده ارزشش از صرفاً کد زدن بیشتره.

🤝 همکاری تیمی
با «Git» کار می‌کنی، کد队友 رو ریویو می‌کنی، از بازخورد استقبال می‌کنی.
یادت باشه: «Code Review» یه فرصته برای یادگیری، نه حمله شخصی.

مدیریت زمان و اولویت‌بندی
همیشه تسک‌های بی‌اهمیت رو نذار جلوی کارهای حیاتی. از «MVP» (حداقل محصول قابل ارائه) استفاده کن و اول چیز اصلی رو تحویل بده.

🧩 حل مسئله و تفکر انتقادی
قبل از نوشتن کد، مشکل رو خوب تحلیل کن. گاهی جواب درست توی ساده‌ترین راه‌حل‌هاست.

📖 یادگیری مستمر
تکنولوژی سریع عوض میشه. هر هفته یه پست بخون، یه «کاتلین کوروتین» جدید یاد بگیر، یا یه «Jetpack Compose» رو عمیق‌تر بکاو.

🔥 مدیریت انتقاد و استرس
باگ می‌دی؟ اشکال نداره. همه دولوپرها این مسیر رو رفتن. مهم اینه که از شکست یاد بگیری و ادامه بدی.

💡 خلاصه‌اش
مهارت نرم، اون چیزیه که یه برنامه‌نویس خوب رو از یه دولوپر حرفه‌ای واقعی جدا می‌کنه.

#Codeit #Android #Kotlin #Jetpack #SoftSkills #DeveloperGrowth #CareerAdvice
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
لیست‌ها در «Kotlin» از پایه‌ای‌ترین مفاهیمی‌ان که هر اندروید دولوپری باید به‌خوبی بشناسهشون 🚀

🔹 فرق اصلی بین دو نوع لیست:
➡️ «MutableList» که می‌تونی بعد از ساختنش آیتم اضافه یا حذف کنی
➡️ «List» که فقط خواندنیه و تغییرناپذیره

🔸 مثال کاربردی:
فرض کن داری یه لیست از اسامی کاربرا رو تو یه «ViewModel» مدیریت می‌کنی. یه بار باید فقط نمایش بدی، یه بار هم باید بهش اضافه کنی.

کد ساده‌ای از تفاوت این دو رو ببین:

val immutableList: List<String> = listOf("Ali", "Sara")
// immutableList.add("Reza") // Error!

val mutableList: MutableList<String> = mutableListOf("Ali", "Sara")
mutableList.add("Reza") // کاملاً مجازه
println(mutableList) // [Ali, Sara, Reza]


📌 توضیح:
«immutableList» چون از نوع «List» هست، هیچ متد تغییردهنده‌ای نداره. اما «mutableList» از «MutableList» ساخته شده و متدهایی مثل «add», «remove» رو داره.

💡 نکته حرفه‌ای:
در برنامه‌نویسی اندروید با «Jetpack Compose» معمولاً از «StateFlow» یا «LiveData» با لیست‌های غیرقابل تغییر استفاده می‌کنن تا از بروز باگ‌های هم‌زمانی جلوگیری بشه. پس بهتره تا جایی که ممکنه از «List» استفاده کنی و فقط در صورت نیاز از «MutableList» بهره ببری.

برداشت عملی:
برای شروع هر پروژه‌ای، نوع لیست رو متناسب با نیازت انتخاب کن. اگه قرار نیست تغییر کنه، از «listOf» استفاده کن؛ در غیر این صورت «mutableListOf» رو به کار ببر.

#Codeit #Android #Kotlin #Jetpack #List #KotlinBasics #Programming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🧩 «MutableList» در کاتلین، لیستی است که می‌توانید اعضای آن را تغییر دهید، اضافه کنید یا حذف کنید.
برخلاف «immutable list» که فقط خواندنی است، «MutableList» برای سناریوهای پویا عالی است.

📌 کاربرد: زمانی که نیاز دارید لیست کاربران، آیتم‌های سبد خرید یا نتایج جستجو را در حین اجرا تغییر دهید.

👨‍💻 کد ساده:
val names = mutableListOf("Ali", "Sara")
names.add("Reza")
names.remove("Sara")
names[0] = "Amir"
println(names) // خروجی: [Amir, Reza]

این کد نشان می‌دهد که چگونه اعضای لیست را اضافه، حذف و ویرایش کنید.

🔄 برای کار با داده‌های پویا در «ViewModel» یا «Repository» از این نوع استفاده کنید.
- همراه با «StateFlow» یا «LiveData» برای واکنش‌گرایی.

🎯 نکته: همیشه نوع «MutableList» را با متدهای کاربردی مثل forEach یا filter ترکیب کنید تا کد تمیزتر شود.

#Codeit #Android #Kotlin #Jetpack #MutableList #KotlinBasics #AndroidDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1
🚀 دیگه وقتشه یه نگاه عمیق‌تر به «Set» در کاتلین بندازیم!
«Set» یه مجموعه‌ست که فقط اعضای یکتا رو نگه می‌داره (بدون تکرار) و ترتیب خاصی هم نداره.
تو کاتلین دو نوع اصلی داریم: «immutable set» با «setOf» و «mutable set» با «mutableSetOf».

⚡️ «Set» موقعی به کار میاد که نیاز به حذف داده‌های تکراری داری، مثلاً لیست آیدی کاربران که هر کدوم باید منحصربه‌فرد باشه.

🧩 همچنین می‌تونی با «Set» عملیات ریاضی مثل اشتراک، اجتماع و تفاضل رو به راحتی انجام بدی.

کد زیر نشون میده چطور «Set» می‌تونه تکراری‌ها رو خودکار حذف کنه و چطور دو «Set» رو باهات مقایسه کنیم:

val firstSet = setOf("A", "B", "C", "A")   // فقط A, B, C نگه می‌داره
val secondSet = setOf("B", "C", "D")

println(firstSet.intersect(secondSet)) // خروجی: [B, C]
println(firstSet.union(secondSet)) // خروجی: [A, B, C, D]
println(firstSet.subtract(secondSet)) // خروجی: [A]


کد بالا اول یک «Set» از حروف می‌سازه که مقدار تکراری «A» فقط یک بار ذخیره می‌شه.
سپس با توابع «intersect»، «union» و «subtract» اشتراک، اجتماع و تفاضل دو مجموعه رو محاسبه می‌کنیم.

📌 نتیجه عملی: از «Set» هر وقت نیاز به حذف تکراری یا عملیات مجموعه‌ای داری استفاده کن؛ کدت تمیزتر و سریع‌تر می‌شه.

#Codeit #Android #Kotlin #Jetpack #Set #Collections #KotlinBasics
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
سوال درست پرسیدن، نیمی از راه حل است. 🧠
خیلی از برنامه‌نویس‌ها وقتشون رو توی فروم‌ها و گروه‌ها تلف می‌کنن، چون سوالشون رو درست نمی‌پرسن. 😫
وقتی سوال خوب می‌پرسی، هم زودتر جواب می‌گیری، هم بقیه یاد می‌گیرن.

نکته اول: مشکل رو دقیق توصیف کن. نگو «کد من کار نمی‌کنه»، بگو «در «Kotlin» وقتی از «StateFlow» استفاده می‌کنم، مقدار اولیه رو نمی‌گیرم». 🎯
نکته دوم: کدت رو کوتاه و قابل اجرا بذار. خطا رو کامل بنویس.
نکته سوم: بگو چیکار کردی تا حلش کنی. این نشون می‌ده باهوشی و وقت آدم‌ها رو نمی‌گیری. 💡

مثال واقعی: به جای «اپلیکیشنم کرش می‌کنه»، بنویس «در «Jetpack Compose» وقتی روی دکمه کلیک می‌کنم، «NullPointerException» می‌گیرم. کد «Button» رو با «viewModelScope.launch» اجرا کردم ولی هنوز خطا دارم».

نتیجه: سوال خوب = جواب سریع = یادگیری عمیق‌تر. 🚀
از امروز تمرین کن. هر سوالی یه قدم به حرفه‌ای‌تر شدنت نزدیک‌ترت می‌کنه.

#Codeit #Android #Kotlin #Jetpack #ProgrammingTips #ProblemSolving #DeveloperMindset #TechCommunity
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
🔹 «Map» در کاتلین یک ساختار کلید-مقدار قدرتمنده که توی ۹۰٪ پروژه‌های اندروید باهاش کار میکنی.
🔸 برخلاف لیست که با ایندکس عددی کار میکنه، اینجا هر مقدار با یه کلید منحصربه‌فرد ذخیره میشه.
🔹 دو نوع اصلی داریم: «immutable» (فقط خواندنی) و «mutable» (قابل تغییر).

📌 یه سناریوی واقعی: ذخیره‌ی تنظیمات کاربر (مثل تم، زبان و اندازه فونت) به‌جای چندتا متغیر جدا.

💡 بیا یه «Map» بسازیم و روش عملیات پایه رو یاد بگیریم:

val settings = mutableMapOf(
"theme" to "dark",
"language" to "en",
"fontSize" to 14
)

// دسترسی به مقدار
println(settings["theme"]) // dark

// اضافه کردن کلید جدید
settings["notifications"] = true

// بروزرسانی مقدار
settings["fontSize"] = 16

// حذف کلید
settings.remove("language")

// بررسی وجود کلید
if (settings.containsKey("theme")) {
println("Theme is set")
}


🔹 «mutableMapOf» یک «MutableMap» میسازه که میتونی مقادیرش رو تغییر بدی.
🔸 با براکت [] هم میتونی بخونی هم بنویسی – اگه کلید نباشه، مقدار null برمی‌گردونه.
🔹 to یه «Pair» میسازه و به‌عنوان ورودی به «mutableMapOf» میره.

🔥 نکته مهم: در کاتلین بهتره تا حد امکان از «immutable map» استفاده کنی تا کدت خطاناپذیرتر بشه.

🚀 تمرین کن: یه «Map» از وضعیت آیتم‌های یه لیست خرید درست کن و عملیات بالا رو روش انجام بده.

#Codeit #Android #Kotlin #Map #Collection #DataStructures
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2
🔹 دوست داری تو یه خط، کل لیست رو تغییر بدی یا فیلتر کنی؟
«map» و «filter» دو تا از قدرتمندترین عملیات‌های مجموعه در «Kotlin» هستن که کدت رو خواناتر و سریع‌تر می‌کنن 😎

🔸 «map» هر المان رو به چیز دیگه‌ای تبدیل می‌کنه. مثلاً لیست اعداد رو به مربع‌شون تبدیل کن.
🔸 «filter» فقط المان‌هایی رو نگه می‌داره که شرط مشخصی داشته باشن. مثلاً فقط اعداد زوج.

📌 کاربرد واقعی: فرض کن لیست قیمت‌های محصولات داری. می‌خوای قیمت‌های بالای ۱۰۰ رو با تخفیف ۲۰٪ نشون بدی.

🔹 اول کد رو ببین:

val prices = listOf(50, 150, 200, 80, 300)

val discounted = prices
.filter { it > 100 }
.map { it * 0.8 }

println(discounted) // [120.0, 160.0, 240.0]


🔸 توضیح: اول با «filter» قیمت‌های بزرگتر از ۱۰۰ رو جدا می‌کنیم، بعد با «map» هر کدوم رو در ۰.۸ ضرب می‌کنیم. نتیجه یه لیست جدید از تخفیف‌هاست.

💡 نکته: این دو عملیات قابل زنجیره شدن هستن و باعث می‌شن نیازی به حلقه‌های تودرتو نباشه. کد تمیزتر و کم‌خطاتر می‌شه.

برداشت عملی: هر وقت خواستی روی یه لیست تغییرات دسته‌جمعی بدی یا فیلترش کنی، از «map» و «filter» استفاده کن. با تمرین، دیگه از «for» بی‌نیاز می‌شی!

#Codeit #Android #Kotlin #Jetpack #FunctionalProgramming #CollectionOperations
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
📦 در دنیای «Kotlin»، وقتی با لیست‌های تو در تو سروکار دارید، دو تا از قدرتمندترین ابزارها «flatMap» و «flatten» هستند.🧩 خیلی ساده بگم: «flatten» یک لیست از لیست‌ها رو به یک لیست تخت تبدیل می‌کنه و «flatMap» همون کار رو انجام میده ولی قبلش به هر عنصر یک نگاشت (مپ) اعمال میکنه.🤯 فرض کنید یک لیست از کاربران دارید که هر کاربر یک لیست از سفارشاتش رو داره. می‌خواید همه سفارشات رو یکجا ببینید. اول با «flatMap» می‌بینیم چطور کار میکنه.

کد عملی:

data class Order(val id: Int, val amount: Double)
data class User(val name: String, val orders: List<Order>)

val users = listOf(
User("Ali", listOf(Order(1, 100.0), Order(2, 200.0))),
User("Sara", listOf(Order(3, 150.0))),
User("Reza", listOf())
)

// استفاده از flatMap برای استخراج همه سفارشات
val allOrders: List<Order> = users.flatMap { it.orders }
println(allOrders) // [Order(1,100.0), Order(2,200.0), Order(3,150.0)]

// flatten فقط برای لیست‌های لیست بدون تغییر عناصر کار میکنه
val listOfLists = listOf(listOf(1,2), listOf(3,4), emptyList())
val flattened = listOfLists.flatten()
println(flattened) // [1, 2, 3, 4]


در این کد: «flatMap» به هر کاربر (عنصر) دسترسی پیدا میکنه، خاصیت «orders» رو برمی‌گردونه و سپس همه لیست‌ها رو در یک لیست تخت می‌ریزه. «flatten» هم برای حالتی که فقط لیست‌های لیست داریم و نمی‌خوایم تغییری در محتوا بدیم عالیه.💡 نکته کلیدی: «flatMap» معادل «map» + «flatten» هستش، ولی خیلی خواناتر و بهینه‌تر.

🔥 کاربرد واقعی: وقتی API‌ای دارید که داده‌های تو در تو برمی‌گردونه (مثلاً لیست گروه‌ها و هر گروه شامل لیست محصولات)، با «flatMap» می‌تونید سریع همه محصولات رو استخراج کنید و در «RecyclerView» نمایش بدید.🚀 این عملیات‌ها باعث میشن کدتون خواناتر، فشرده‌تر و دور از حلقه‌های تودرتو باشه. حتماً توی پروژه‌هاتون امتحان کنید.

#Codeit #Android #Kotlin #Jetpack #KotlinCollections #FlatMap #Flatten #FunctionalProgramming
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🥰1
🧠 «Problem Solving» یکی از مهم‌ترین مهارت‌های یک برنامه‌نویس حرفه‌ای‌ست، ولی خیلی‌ها فقط کد می‌زنن بدون اینکه ذهنشون رو برای حل مسائل عمیق تمرین بدن.

🚀 «Becoming a Better Problem Solver» یعنی یاد بگیری چطور به جای وحشت از باگ‌ها و خطاها، ازشون به عنوان چالش یادگیری استفاده کنی.

💡 اولین قدم: مسئله رو خوب تعریف کن. تا نفهمی دقیقاً مشکل چیه، راه‌حل درست پیدا نمی‌شه.

🔍 دومین قدم: مسئله رو به بخش‌های کوچیکتر بشکن. مثل «Divide and Conquer» تو دنیای الگوریتم‌ها.

🧩 سومین قدم: راه‌حل‌های مختلف رو لیست کن. حتی اون‌هایی که احمقانه به نظر میرسن. گاهی بهترین ایده از عجیب‌ترین جاها میاد.

📝 چهارمین قدم: راه‌حل رو روی کاغذ یا تو ذهنت شبیه‌سازی کن. قبل از نوشتن کد، مطمئن شو منطق کار می‌کنه.

🛠️ پنجمین قدم: پیاده‌سازی کن و تست بگیر. باگ‌ها رو بغل کن، چون هر باگ یه فرصت یادگیریه.

🎯 نکته کلیدی: هر روز حداقل یک مسئله کوچیک حل کن. از سایت‌هایی مثل «LeetCode» یا «Codewars» استفاده کن.

🔥 یادت باشه: بهترین برنامه‌نویس‌ها کسایی نیستن که هیچوقت باگ ندارن، بلکه کسایی هستن که بهترین روش حل مسئله رو بلدن.

این مهارت رو می‌تونی تو پروژه‌های واقعی «Android» با «Kotlin» هم تمرین کنی. مثلاً وقتی معماری «Clean Architecture» رو پیاده می‌کنی، ذهنت خودش مسئله‌ها رو به لایه‌های مستقل تقسیم می‌کنه.

📈 نتیجه: هر بار که یه مشکل سخت رو حل می‌کنی، یه قدم به یه برنامه‌نویس حرفه‌تر نزدیک‌تر می‌شی.

#Codeit #Android #Kotlin #Jetpack #ProblemSolving #DeveloperMindset #CleanCode
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔥 توی دنیای واقعی، همیشه داده‌ها رو بر اساس یه ویژگی مشترک دسته‌بندی می‌کنیم. مثلاً مشتری‌ها بر اساس شهر، یا محصولات بر اساس دسته‌بندی. توی «Kotlin» یه تابع خفن به اسم «groupBy» هست که دقیقاً همین کار رو می‌کنه.

🌀 «groupBy» یه عملیات «Collection» هست که لیست رو بر اساس یه کلید مشخص به «Map» تبدیل می‌کنه. هر کلید به لیستی از آیتم‌هایی که اون کلید رو دارند اشاره می‌کنه.

فرض کن لیستی از سفارش‌های یک فروشگاه آنلاین داری. می‌خوای سفارش‌ها رو بر اساس وضعیت (مثلاً «پرداخت شده» یا «در انتظار») دسته‌بندی کنی. اینجا «groupBy» عالیه.

📌 بیا یه مثال ساده ببینیم. اول یه «data class» برای سفارش تعریف می‌کنیم:

data class Order(
val id: Int,
val status: String,
val amount: Double
)


🧩 حالا یه لیست از سفارش‌ها داریم و می‌خوایم با «groupBy» دسته‌بندیشون کنیم:

val orders = listOf(
Order(1, "Paid", 150.0),
Order(2, "Pending", 200.0),
Order(3, "Paid", 300.0),
Order(4, "Canceled", 50.0),
Order(5, "Pending", 120.0)
)

val groupedByStatus = orders.groupBy { it.status }


📊 حالا «groupedByStatus» یه «Map» هست که کلیدش وضعیت و مقدارش لیست سفارش‌های هم‌وضعیت‌ه. مثلاً:

// خروجی:
// {Paid=[Order(1, Paid, 150.0), Order(3, Paid, 300.0)],
// Pending=[Order(2, Pending, 200.0), Order(5, Pending, 120.0)],
// Canceled=[Order(4, Canceled, 50.0)]}


💡 اگه نیاز به دسته‌بندی پیشرفته‌تر داشته باشی، «groupBy» می‌تونه یه «lambda» برای تبدیل مقدار هم قبول کنه. مثلاً فقط اسم سفارش‌ها رو ذخیره کنی:

val groupedIds = orders.groupBy(
keySelector = { it.status },
valueTransform = { it.id }
)
// خروجی: {Paid=[1, 3], Pending=[2, 5], Canceled=[4]}


🚀 این تابع توی هر جایی که نیاز به دسته‌بندی داری به کار میاد: از داشبورد مدیریت تا گزارش‌گیری و تحلیل داده. حتماً تو پروژه‌هات استفاده کن.

#Codeit #Android #Kotlin #Jetpack #CollectionOperations #groupBy #KotlinTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🧩 لیست‌هات رو مرتب می‌کنی، اما می‌خوای بر اساس یه خاصیت مشخص مرتب‌سازی کنی؟ «sortedBy» تو «Kotlin» دقیقاً همین کار رو انجام میده. دیگه نیاز نیست خودت بنویسی که چطور مقایسه کنی.

«sortedBy» یه lambda می‌گیره که مشخص می‌کنه بر اساس کدوم خاصیت (مثلاً اسم، سن، تاریخ) لیست مرتب بشه. برعکس «sorted» که فقط روی خود آیتم‌ها کار می‌کنه (مثلاً اعداد یا رشته‌ها).

💡 فرض کن یه لیست از کاربرا داری و می‌خوای بر اساس «age» (سن) صعودی مرتب بشن. با «sortedBy» خیلی راحت میشه.

کد عملی رو با یه مثال واقعی ببین:

data class User(val name: String, val age: Int)

fun main() {
val users = listOf(
User("Ali", 25),
User("Sara", 30),
User("Reza", 22)
)
val sortedUsers = users.sortedBy { it.age }
println(sortedUsers)
}


تو این کد یه لیست از کاربرا با نام و سن داریم. با «sortedBy { it.age }» لیست رو بر اساس سن به ترتیب صعودی مرتب می‌کنیم. خروجی: «User(name=Reza, age=22), User(name=Ali, age=25), User(name=Sara, age=30)».

نکته مهم: «sortedBy» یه لیست جدید برمی‌گردونه و لیست اصلی رو تغییر نمی‌ده (immutable). اگر نیاز به مرتب‌سازی نزولی داری، از «sortedByDescending» استفاده کن.

با «sortedBy» می‌تونی هر نوع داده‌ای رو بر اساس یه خاصیت به راحتی مرتب کنی. این یه ابزار قدرتمنده برای پردازش لیست‌ها تو «Kotlin».

#Codeit #Android #Kotlin #Jetpack #CollectionOperations #Sorting #KotlinTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥2