🚫 تو کاتلین، null دیگه ترسناک نیست! 😎
با سیستم Null Safety، دیگه خبری از NullPointerException های ناگهانی نیست.
? یا !! بهت کمک میکنه با خیال راحت با nullها کار کنی.
? با استفاده از ?. میتونی فقط در صورت non-null بودن عملیات رو انجام بدی.
? اپراتور elvis (?:) مقدار پیشفرض رو برمیگردونه اگه null باشه.
? اگه مطمئنی null نیستی، !! میتونه اونو به non-null تبدیل کنه (با ریسک خودت!).
? شروع کن با Safe Calls و Elvis، بعداً سراغ !! برو.
? کدهای کاتلینت دیگه کرش نمیکنه، مگه خودت بخوای!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
با سیستم Null Safety، دیگه خبری از NullPointerException های ناگهانی نیست.
? یا !! بهت کمک میکنه با خیال راحت با nullها کار کنی.
? با استفاده از ?. میتونی فقط در صورت non-null بودن عملیات رو انجام بدی.
? اپراتور elvis (?:) مقدار پیشفرض رو برمیگردونه اگه null باشه.
? اگه مطمئنی null نیستی، !! میتونه اونو به non-null تبدیل کنه (با ریسک خودت!).
? شروع کن با Safe Calls و Elvis، بعداً سراغ !! برو.
? کدهای کاتلینت دیگه کرش نمیکنه، مگه خودت بخوای!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🧵 اپراتور Safe Call در Kotlin چیه؟
وقتی متغیر nullable داریم، بهجای if(!=null) میایم از ?. استفاده میکنیم! 🎯
🔹 اگه null باشه، کد ادامه پیدا میکنه بدون ارور
🔹 مثلاً: str?.length → اگه str=null باشه، نتیجه null هستش
🔹 با این کار از NPE در امان میمونیم ✅
⚠️ یادتون باشه: Safe Call فقط روی nullable ها کار میکنه
💡 ترکیبش با let خیلی کاربردی میشه: str?.let { print(it) }
🛠️ یه مثال سریع:
val name: String? = null
println(name?.uppercase()) // خروجی: null
📌 نکته: برای زنجیرش هم میشه استفاده کرد: a?.b?.c?.d
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی متغیر nullable داریم، بهجای if(!=null) میایم از ?. استفاده میکنیم! 🎯
🔹 اگه null باشه، کد ادامه پیدا میکنه بدون ارور
🔹 مثلاً: str?.length → اگه str=null باشه، نتیجه null هستش
🔹 با این کار از NPE در امان میمونیم ✅
⚠️ یادتون باشه: Safe Call فقط روی nullable ها کار میکنه
💡 ترکیبش با let خیلی کاربردی میشه: str?.let { print(it) }
🛠️ یه مثال سریع:
val name: String? = null
println(name?.uppercase()) // خروجی: null
📌 نکته: برای زنجیرش هم میشه استفاده کرد: a?.b?.c?.d
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
✅ عملگر الویس (?:) در Kotlin جایگزین کوتاه برای if-else است.
🔹 کاربرد: وقتی یک مقدار nullable داریم، اگر نال نبود استفاده میشود وگرنه مقدار پیشفرض.
🔸 مثال:
val name: String? = null
val result = name ?: "مهمان"
✅ نتیجه: "مهمان" (چون name نال بود).
🔹 نکته: عملگر الویس همیشه مقدار غیرنال برمیگرداند.
🔸 ترکیب با let:
name?.let { print(it) } ?: print("نال")
📌 مناسب برای زنجیرهسازی و کاهش کد.
💡 بهجای if-else طولانی از این عملگر استفاده کن.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 کاربرد: وقتی یک مقدار nullable داریم، اگر نال نبود استفاده میشود وگرنه مقدار پیشفرض.
🔸 مثال:
val name: String? = null
val result = name ?: "مهمان"
✅ نتیجه: "مهمان" (چون name نال بود).
🔹 نکته: عملگر الویس همیشه مقدار غیرنال برمیگرداند.
🔸 ترکیب با let:
name?.let { print(it) } ?: print("نال")
📌 مناسب برای زنجیرهسازی و کاهش کد.
💡 بهجای if-else طولانی از این عملگر استفاده کن.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔹 تو کاتلین دو نوع Type Cast داریم: safe cast با
🔹 اگه از
🔹 اما
🔹 برای چک کردن نوع از
🔹 بعد از چک با
🔹 مثال:
🔹 از
🔹 همیشه قبل از cast مطمئن شو نوع درسته یا از safe cast استفاده کن
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
as? و unsafe با as 🔹 اگه از
as استفاده کنی و نوع نادرست باشه، برنامه کرش میکنه! 💥 🔹 اما
as? اگه نادرست باشه، null برمیگردونه و خطا نمیده ✅ 🔹 برای چک کردن نوع از
is و !is استفاده کن 🔹 بعد از چک با
is، نیازی به cast مجدد نداری (Smart Cast) 🤖 🔹 مثال:
val x: Any = "Hello"
if (x is String) println(x.length) // Smart Cast
🔹 از
as? برای جلوگیری از ClassCastException استفاده کن 🔹 همیشه قبل از cast مطمئن شو نوع درسته یا از safe cast استفاده کن
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🚀 تو کاتلین،
یه عبارت (Expression) هست که میتونه مقدار برگردونه.
🔹 مثلاً به جای نوشتن if-else جدا، مستقیم مقدار توی متغیر ذخیره کن:
🔸 دیگه نیاز به عملگر سهتایی (ternary) نداری!
🔹
📌 نکته: برای شروط چندبخشی، از
✅ کد خواناتر و جمعوجورتر از جاوا میشه.
🎯 یه نکته حرفهای: ترکیب
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
if دیگه فقط یه شرط ساده نیست! یه عبارت (Expression) هست که میتونه مقدار برگردونه.
🔹 مثلاً به جای نوشتن if-else جدا، مستقیم مقدار توی متغیر ذخیره کن:
val max = if (a > b) a else b
🔸 دیگه نیاز به عملگر سهتایی (ternary) نداری!
🔹
if میتونه چند خط بدنه داشته باشه و آخرین خط رو برمیگردونه. 📌 نکته: برای شروط چندبخشی، از
if-else if به صورت زنجیرهای استفاده کن. ✅ کد خواناتر و جمعوجورتر از جاوا میشه.
🎯 یه نکته حرفهای: ترکیب
if با functionها برای منطق پیچیدهتر عالیه. 🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
🔥 When Expression در کاتلین، یه جایگزین قدرتمند برای
💡 میتونه بهعنوان یه عبارت (Expression) استفاده بشه و مقدار برگردونه.
✅ سینتکس ساده و خوانا:
⚡ بدون نیاز به
🔍 حتی میتونه بازهها (Range) رو هم چک کنه:
🎯 برای مبتدیها سوئیچینگ منطقی رو سادهتر و خواناتر میکنه.
🚀 همین حالا تو پروژههات ازش استفاده کن!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
switch جاواست! 💡 میتونه بهعنوان یه عبارت (Expression) استفاده بشه و مقدار برگردونه.
✅ سینتکس ساده و خوانا:
val result = when (x) {
1 -> "One"
2 -> "Two"
else -> "Unknown"
}
⚡ بدون نیاز به
break، فقط شرطها رو بررسی میکنه. 🔍 حتی میتونه بازهها (Range) رو هم چک کنه:
when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
else -> "C"
}
🎯 برای مبتدیها سوئیچینگ منطقی رو سادهتر و خواناتر میکنه.
🚀 همین حالا تو پروژههات ازش استفاده کن!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔁 حلقه for در کاتلین، سادهترین راه برای تکرار یه بلوک کده 😎
📌 ساختار پایه: for (item in collection) { ... }
🎯 میتونی از range استفاده کنی: for (i in 1..5)
💡 حتی میتونی مرحله رو تنظیم کنی: for (i in 1..10 step 2)
🧩 تکرار روی لیست یا آرایه هم مثل آب خوردن: for (name in names)
🔥 با destructing declaration هم جفت میشه: for ((index, value) in list.withIndex())
🛠️ while و do-while هم هست، ولی for خواناترین گزینهست
📚 یادش بگیر، بعد تو پروژههات ازش استفاده کن
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
📌 ساختار پایه: for (item in collection) { ... }
🎯 میتونی از range استفاده کنی: for (i in 1..5)
💡 حتی میتونی مرحله رو تنظیم کنی: for (i in 1..10 step 2)
🧩 تکرار روی لیست یا آرایه هم مثل آب خوردن: for (name in names)
🔥 با destructing declaration هم جفت میشه: for ((index, value) in list.withIndex())
🛠️ while و do-while هم هست، ولی for خواناترین گزینهست
📚 یادش بگیر، بعد تو پروژههات ازش استفاده کن
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔁 حلقه
✅ وقتی تعداد تکرار نامشخصه،
📝 ساختار ساده:
🔄 تا وقتی شرط true باشه، بدنه اجرا میشه
⚠️ حواست به بینهایت شدن loop باشه!
💡 میتونی از
🎯 مثال واقعی: منتظر ورود کاربر موندن تا شرط برآورده بشه
📌 مبحث پایه ولی فوقالعاده کاربردی برای کنترل جریان برنامه
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
while در کاتلین – تکرار تا وقتی که شرط درسته!✅ وقتی تعداد تکرار نامشخصه،
while رو استفاده کن 📝 ساختار ساده:
var i = 0
while (i < 5) {
println(i)
i++
}
🔄 تا وقتی شرط true باشه، بدنه اجرا میشه
⚠️ حواست به بینهایت شدن loop باشه!
💡 میتونی از
do-while هم استفاده کنی که حداقل یک بار اجرا بشه 🎯 مثال واقعی: منتظر ورود کاربر موندن تا شرط برآورده بشه
📌 مبحث پایه ولی فوقالعاده کاربردی برای کنترل جریان برنامه
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
🔹 توابع در Kotlin – اولین قدم برای کد نویسی تمیز! 🚀
1️⃣ تعریف تابع با fun شروع میشه:
2️⃣ نوع برگشتی رو مشخص کن، حتی اگه Unit (void) باشه! 🎯
3️⃣ پارامترها رو با اسم و نوع بنویس:
4️⃣ توابع تکخطی رو با = بنویس، نیازی به return نیست! ✨
5️⃣ آرگومانهای پیشفرض (default) خیلی بهدردبخورن:
6️⃣ توابع رو میتونی داخل کلاس یا مستقل تعریف کنی – انعطافپذیر 😎
7️⃣ یادت باشه: هر تابع یه کار خاص انجام بده (SRP) ⚡
8️⃣ مثال سریع:
🔥 همین الان تمرین کن و کد مرتبتر بنویس!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
1️⃣ تعریف تابع با fun شروع میشه:
fun greet(): String { return "Hello" }2️⃣ نوع برگشتی رو مشخص کن، حتی اگه Unit (void) باشه! 🎯
3️⃣ پارامترها رو با اسم و نوع بنویس:
fun sum(a: Int, b: Int): Int = a + b4️⃣ توابع تکخطی رو با = بنویس، نیازی به return نیست! ✨
5️⃣ آرگومانهای پیشفرض (default) خیلی بهدردبخورن:
fun greet(name: String = "User") { ... }6️⃣ توابع رو میتونی داخل کلاس یا مستقل تعریف کنی – انعطافپذیر 😎
7️⃣ یادت باشه: هر تابع یه کار خاص انجام بده (SRP) ⚡
8️⃣ مثال سریع:
fun isEven(n: Int) = n % 2 == 0🔥 همین الان تمرین کن و کد مرتبتر بنویس!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔹 توابع در کاتلین قلب برنامهنویسیاند! 🚀
🔹 یه تابع کار خاصی رو انجام میده و کدت رو خواناتر و قابل استفادهتر میکنه.
🔹 syntax سادهاش:
🔹 میتونه ورودی بگیره (param) و خروجی بده (return).
🔹 حتی میتونه یه مقدار پیشفرض به پارامترها بده!
🔹 مثال:
🔹 توابع خطتکی با
🔹 اینطوری کدت جمعوجورتر و خواناتر میشه.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 یه تابع کار خاصی رو انجام میده و کدت رو خواناتر و قابل استفادهتر میکنه.
🔹 syntax سادهاش:
fun name() { ... } 😎 🔹 میتونه ورودی بگیره (param) و خروجی بده (return).
🔹 حتی میتونه یه مقدار پیشفرض به پارامترها بده!
🔹 مثال:
fun greet(name: String = "World") 🔹 توابع خطتکی با
= هم مینویسی: fun sum(a: Int, b: Int) = a + b 🔹 اینطوری کدت جمعوجورتر و خواناتر میشه.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
🔷 کلاسها در کاتلین 🚀
🔹 کلاسها قلب برنامهنویسی شیگرا در کاتلین هستند.
🔹 فرق بین
🔹
🔹
🔹 از
🔹 کلاسهای تو در تو (
🔹
🔹 حواست به visibility modifiers (private, internal) باشه.
🐍 کلاسهای کاتلین رو قورت بده!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 کلاسها قلب برنامهنویسی شیگرا در کاتلین هستند.
🔹 فرق بین
data class و sealed class رو میدونی؟ 🧐 🔹
data class خودش toString، equals و hashCode رو میسازه! 🔹
sealed class برای محدود کردن سلسلهمراتب کلاسها عالیه. 🔹 از
object برای singletonهای ساده استفاده کن. 🔹 کلاسهای تو در تو (
nested class) با inner class فرق دارن. 🔹
companion object جایگزین static memberهای جاواست. 🔹 حواست به visibility modifiers (private, internal) باشه.
🐍 کلاسهای کاتلین رو قورت بده!
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔵 آبجکتها در کاتلین؛ فراتر از کلاسهای معمولی!
۱️⃣
۲️⃣
۳️⃣
۴️⃣ داخل companion میتونی از const val برای ثابتها استفاده کنی 🧮
۵️⃣ با
۶️⃣ همچنین میشه از آبجکتها به عنوان delegate برای delegation استفاده کرد 🧠
۷️⃣ نکته: companion object میتونه نام داشته باشه یا anonymous باشه 📌
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
۱️⃣
object یعنی تعریف یک singleton بدون دردسر 🧩 ۲️⃣
companion object جایگزین اعضای static در جاوا 🚀 ۳️⃣
object expression ساخت anonymous object در لحظه 🎯 ۴️⃣ داخل companion میتونی از const val برای ثابتها استفاده کنی 🧮
۵️⃣ با
object دیگه نیازی به الگوی Singleton نخواهی داشت 🙌 ۶️⃣ همچنین میشه از آبجکتها به عنوان delegate برای delegation استفاده کرد 🧠
۷️⃣ نکته: companion object میتونه نام داشته باشه یا anonymous باشه 📌
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
✅ اشیاء در کاتلین فراتر از اشیاء ساده هستند! 🎯
🔹
🔹
🔹
🔹 همه اینها در سطح باینری بهینه و thread-safe هستند
🔹 مثال:
🔹 نکته: companion object در واقع یک شیء تو در توست، نه static واقعی
🔹 اشیاء میتوانند از کلاسها و اینترفیسها ارث برند
⚡️ با این ابزارها کد تمیزتر و بدون boilerplate مینویسید
📚 این مبحث پایهای برای الگوهای طراحی در کاتلینه
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹
object برای تعریف singleton بدون نیاز به کلاس اضافی 🔹
companion object برای اعضای استاتیک مثل جاوا، اما خواناتر 🔹
object expression برای ایجاد anonymous object درجا 🔹 همه اینها در سطح باینری بهینه و thread-safe هستند
🔹 مثال:
object NetworkConfig { ... } یک نمونه سراسری 🔹 نکته: companion object در واقع یک شیء تو در توست، نه static واقعی
🔹 اشیاء میتوانند از کلاسها و اینترفیسها ارث برند
⚡️ با این ابزارها کد تمیزتر و بدون boilerplate مینویسید
📚 این مبحث پایهای برای الگوهای طراحی در کاتلینه
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔷 مفهوم ارثبری (Inheritance) در Kotlin – سطح متوسط 🧬
ارثبری یکی از مفاهیم اصلی شیءگراییه که به شما اجازه میده کلاسهای جدیدی بر پایه کلاسهای موجود بسازید.
در Kotlin، کلاسها بهطور پیشفرض
مثال عملی: فرض کنید یک کلاس پایه
حالا یک کلاس
✅ در اینجا
✅ سازنده کلاس والد با
🔸 نکات مهم:
- برای override حتماً از
- اگر کلاس والد سازنده بدون پارامتر نداره، باید پارامترها رو پاس بدید.
- ارثبری چندگانه نداریم (ترجیحاً از interface استفاده کنید).
🔹 مثال پیشرفتهتر: استفاده از
این کد نشون میده که با
📌 ارثبری رو در پروژههای واقعی برای باز استفاده از کد و اعمال چندریختی (Polymorphism) به کار ببرید.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
ارثبری یکی از مفاهیم اصلی شیءگراییه که به شما اجازه میده کلاسهای جدیدی بر پایه کلاسهای موجود بسازید.
در Kotlin، کلاسها بهطور پیشفرض
final هستند و برای ارثبری باید با کلیدواژه open مشخص بشن. مثال عملی: فرض کنید یک کلاس پایه
Animal داریم:open class Animal(val name: String) {
open fun sound() = "Some sound"
}
حالا یک کلاس
Cat از آن ارث میبریم: class Cat(name: String) : Animal(name) {
override fun sound() = "Meow"
}
✅ در اینجا
open اجازه override متد sound رو میده. ✅ سازنده کلاس والد با
: Animal(name) صدا زده میشه. 🔸 نکات مهم:
- برای override حتماً از
override استفاده کنید. - اگر کلاس والد سازنده بدون پارامتر نداره، باید پارامترها رو پاس بدید.
- ارثبری چندگانه نداریم (ترجیحاً از interface استفاده کنید).
🔹 مثال پیشرفتهتر: استفاده از
super برای دسترسی به متد والد: open class Dog(name: String) : Animal(name) {
final override fun sound() = "Woof" // متد نهایی
}
این کد نشون میده که با
final میشه از override مجدد جلوگیری کرد. 📌 ارثبری رو در پروژههای واقعی برای باز استفاده از کد و اعمال چندریختی (Polymorphism) به کار ببرید.
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
📌 اینترفیسهای Kotlin رو جدی بگیر؛ اگه فقط با کلاسهای abstract کار کردی، نصف راه رو رفتی!
✅ اینترفیسها قراردادهای قدرتمندی هستن که بدون وابستگی به سلسلهمراتب، رفتار رو تعریف میکنن.
💡 توی یک اپ واقعی، مثلاً میخوای انواع مختلف پرداخت (کارت، کیف پول، رمزارز) رو مدیریت کنی.
📌 هر سرویس پرداخت باید متد
👇 نمونه کد ساده اما کاربردی:
✅ اینترفیس بهت انعطاف میده: میتونی هر کلاس جدیدی بدون تغییر کد قبلی اضافه کنی.
💡 بهترین تمرین: برای هر «قابلیت» در اپت یه اینترفیس در نظر بگیر، بعد dependency injection رو استفاده کن.
#Kotlin #Interface #AndroidDev #CleanArchitecture #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
✅ اینترفیسها قراردادهای قدرتمندی هستن که بدون وابستگی به سلسلهمراتب، رفتار رو تعریف میکنن.
💡 توی یک اپ واقعی، مثلاً میخوای انواع مختلف پرداخت (کارت، کیف پول، رمزارز) رو مدیریت کنی.
📌 هر سرویس پرداخت باید متد
pay(amount) رو داشته باشه. با اینترفیس یه قرارداد میبندی و پیادهسازی رو به کلاسها میسپاری.👇 نمونه کد ساده اما کاربردی:
interface PaymentService {
fun pay(amount: Double): String
fun validate(): Boolean
}
class CardPayment : PaymentService {
override fun pay(amount: Double): String {
return "پرداخت $amount با کارت انجام شد."
}
override fun validate(): Boolean {
// اعتبارسنجی شماره کارت
return true
}
}
class WalletPayment : PaymentService {
override fun pay(amount: Double): String {
return "پرداخت $amount از کیف پول انجام شد."
}
override fun validate(): Boolean {
// بررسی موجودی
return true
}
}
✅ اینترفیس بهت انعطاف میده: میتونی هر کلاس جدیدی بدون تغییر کد قبلی اضافه کنی.
💡 بهترین تمرین: برای هر «قابلیت» در اپت یه اینترفیس در نظر بگیر، بعد dependency injection رو استفاده کن.
#Kotlin #Interface #AndroidDev #CleanArchitecture #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
📦 Data Class در کاتلین چیزی فراتر از یک کلاس ساده است!
وقتی از
🧩 مشکل: تو پروژههای بزرگ مجبوری بارها کد تکراری برای مدلها بنویسی.
✅ راهحل:
🔄 یک مثال واقعی: مدل کاربر با فیلدهای
🧪 کد عملی:
📋 توضیح:
-
- Destructuring به کمک
🚀 نکته حرفهای:
از
برای حفظ immutability فیلدها رو با
#DataClass #KotlinTips #CleanCode #Destructuring #Model #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی از
data class استفاده میکنی، کاتلین خودش متدهای toString، equals، hashCode، copy و componentN رو میسازه. 🧩 مشکل: تو پروژههای بزرگ مجبوری بارها کد تکراری برای مدلها بنویسی.
✅ راهحل:
data class با یه خط کد تمام این کارها رو برات انجام میده. 🔄 یک مثال واقعی: مدل کاربر با فیلدهای
nullable و نیاز به کپی کردن یه مقدار تغییر یافته. 🧪 کد عملی:
data class User(
val id: Int,
val name: String,
val email: String?,
val isActive: Boolean = true
)
fun main() {
val original = User(1, "Ali", "ali@example.com", true)
val updated = original.copy(email = null, isActive = false)
println(original) // User(id=1, name=Ali, email=ali@example.com, isActive=true)
println(updated) // User(id=1, name=Ali, email=null, isActive=false)
// Destructuring
val (id, name, email) = updated
println("$id - $name - $email") // 1 - Ali - null
}
📋 توضیح:
-
copy() بدون تغییر فیلدهای دیگه، یه نمونه جدید با فیلدهای دلخواه میسازه. - Destructuring به کمک
componentN کار میکنه و کد خوندنیتری میده. 🚀 نکته حرفهای:
از
data class فقط برای نگهداری داده استفاده کن (نه منطق سنگین). برای حفظ immutability فیلدها رو با
val تعریف کن. #DataClass #KotlinTips #CleanCode #Destructuring #Model #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
🔹 تا حالا خواستی یه مجموعه ثابت از مقادیر رو توی کاتلین مدیریت کنی؟
🔸 Enum Class دقیقاً برای همینه! یه نوع خاص از کلاس که مقادیر از پیش تعریفشده داره و میتونه رفتار اختصاصی هم داشته باشه.
🔹 فرض کن قراره وضعیتهای یه سفارش رو مدل کنی: Pending, Shipped, Delivered.
🔸 بدون Enum مجبوری از String یا Int استفاده کنی و خطاهای انسانی زیاد میشه. اما Enum کلاس اون رو تایپ-سیف و خواناتر میکنه.
🔹 Enum توی کاتلین خیلی فراتر از یه لیست سادهست:
🔸 میتونه پراپرتی داشته باشه، متد داشته باشه، حتی اینترفیس implement کنه.
🔹 مثال عملی: یه ماشینحالت ساده برای پردازش سفارش با انتقال بین وضعیتها:
🔹 این کد نشون میده که هر وضعیت یه label (برچسب فارسی) داره و منطق انتقال مجاز بین وضعیتها رو توی متد canTransitionTo تعریف کردیم.
🔸 مزیت: خطای انسانی کم میشه، کد خوانا و قابل نگهداریست.
🔹 یه نکته حرفهای: از Enum برای ثابتهایی که رفتار متفاوت دارن استفاده کن (مثل Strategy Pattern ساده).
🔸 از when به جای if-های طولانی استفاده کن تا کد تمیز بمونه.
#EnumClass #Kotlin #کاتلین #برنامهنویسی #Android #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔸 Enum Class دقیقاً برای همینه! یه نوع خاص از کلاس که مقادیر از پیش تعریفشده داره و میتونه رفتار اختصاصی هم داشته باشه.
🔹 فرض کن قراره وضعیتهای یه سفارش رو مدل کنی: Pending, Shipped, Delivered.
🔸 بدون Enum مجبوری از String یا Int استفاده کنی و خطاهای انسانی زیاد میشه. اما Enum کلاس اون رو تایپ-سیف و خواناتر میکنه.
🔹 Enum توی کاتلین خیلی فراتر از یه لیست سادهست:
🔸 میتونه پراپرتی داشته باشه، متد داشته باشه، حتی اینترفیس implement کنه.
🔹 مثال عملی: یه ماشینحالت ساده برای پردازش سفارش با انتقال بین وضعیتها:
enum class OrderStatus(val label: String) {
Pending("در انتظار تأیید"),
Shipped("ارسال شده"),
Delivered("تحویل داده شده"),
Cancelled("لغو شده");
fun canTransitionTo(next: OrderStatus): Boolean {
return when (this) {
Pending -> next == Shipped || next == Cancelled
Shipped -> next == Delivered
else -> false
}
}
}
fun main() {
val current = OrderStatus.Pending
println(current.label) // در انتظار تأیید
println(current.canTransitionTo(OrderStatus.Shipped)) // true
}
🔹 این کد نشون میده که هر وضعیت یه label (برچسب فارسی) داره و منطق انتقال مجاز بین وضعیتها رو توی متد canTransitionTo تعریف کردیم.
🔸 مزیت: خطای انسانی کم میشه، کد خوانا و قابل نگهداریست.
🔹 یه نکته حرفهای: از Enum برای ثابتهایی که رفتار متفاوت دارن استفاده کن (مثل Strategy Pattern ساده).
🔸 از when به جای if-های طولانی استفاده کن تا کد تمیز بمونه.
#EnumClass #Kotlin #کاتلین #برنامهنویسی #Android #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🧩 آیا تا به حال شده که بخوای یه وضعیت خاص رو توی کدهات مدیریت کنی ولی enum جواب نده؟
بیا با Sealed Class آشنا بشیم؛ یه ابزار قدرتمند توی Kotlin برای تعریف محدودیتهای دقیق روی نوعها.
📦 Sealed Class چیه؟
یه کلاس که زیرکلاسهاش فقط توی همون فایل یا package تعریف میشن. این یعنی کامپایلر همهی حالتهای ممکن رو میدونه و میتونه exhaustive بودن
✅ کاربرد واقعی: مدیریت stateهای مختلف یه صفحه (Loading, Success, Error).
بهجای if/else بینظم، از sealed class استفاده کن تا کدت خواناتر و مطمئنتر بشه.
🔧 بیایید یه مثال ساده ببینیم:
💡 این کد چیکار میکنه؟
سه حالت ممکن رو با sealed class تعریف کردیم.
🚀 نکتهی کاربردی:
از sealed class برای Representationهای محدود (مثلا نوع خطاها، نتیجهی API، یا ناوبری صفحهها) استفاده کن. این کار type safety رو افزایش میده و کدت رو پیشبینیپذیرتر میکنه.
#SealedClass #Kotlin #Android #Jetpack #کدایت #Codeit #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
بیا با Sealed Class آشنا بشیم؛ یه ابزار قدرتمند توی Kotlin برای تعریف محدودیتهای دقیق روی نوعها.
📦 Sealed Class چیه؟
یه کلاس که زیرکلاسهاش فقط توی همون فایل یا package تعریف میشن. این یعنی کامپایلر همهی حالتهای ممکن رو میدونه و میتونه exhaustive بودن
when رو تضمین کنه. ✅ کاربرد واقعی: مدیریت stateهای مختلف یه صفحه (Loading, Success, Error).
بهجای if/else بینظم، از sealed class استفاده کن تا کدت خواناتر و مطمئنتر بشه.
🔧 بیایید یه مثال ساده ببینیم:
sealed class UiState {
object Loading : UiState()
data class Success(val data: String) : UiState()
data class Error(val message: String) : UiState()
}
fun handleState(state: UiState) {
when (state) {
is UiState.Loading -> println("در حال بارگذاری... 🌀")
is UiState.Success -> println("داده دریافت شد: ${state.data} ✅")
is UiState.Error -> println("خطا: ${state.message} ❌")
}
}
💡 این کد چیکار میکنه؟
سه حالت ممکن رو با sealed class تعریف کردیم.
when exhaustive هست و نیازی به else نداره. اگه بعداً یه حالت جدید اضافه کنی، کامپایلر اخطار میده که باید مدیریتش کنی. 🚀 نکتهی کاربردی:
از sealed class برای Representationهای محدود (مثلا نوع خطاها، نتیجهی API، یا ناوبری صفحهها) استفاده کن. این کار type safety رو افزایش میده و کدت رو پیشبینیپذیرتر میکنه.
#SealedClass #Kotlin #Android #Jetpack #کدایت #Codeit #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
✨ توابع الحاقی (Extension Functions) تو کاتلین، یه قابلیت جادوییان که بهت اجازه میدن بدون ارثبری یا تغییر کلاس، متد جدید بهش اضافه کنی! 🪄
🧠 فرض کن یه کلاس از کتابخونهی شخص ثالث داری و میخوای یه متد خاص روش پیادهسازی کنی. با Extension Functions میتونی انگار که اون متد جزو کلاس اصلیه، ازش استفاده کنی.
📱 مثال واقعی: فرض کن میخوای یه
✅ این کد یه متد جدید به اسم
🎯 نکته: Extension Functions静态 (static) هستن و override نمیشن. اگر کلاس همون متد رو داشته باشه، اولویت با متد اصلیه.
🔥 بهترین تمرین: از Extension Functions برای جدا کردن منطق کمکی از کلاسهای اصلی استفاده کن، مخصوصاً برای Utility functions.
#ExtensionFunctions #KotlinTips #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🧠 فرض کن یه کلاس از کتابخونهی شخص ثالث داری و میخوای یه متد خاص روش پیادهسازی کنی. با Extension Functions میتونی انگار که اون متد جزو کلاس اصلیه، ازش استفاده کنی.
📱 مثال واقعی: فرض کن میخوای یه
String رو به صورت URL-safe encode کنی، ولی متد آماده نداره. میتونی یه Extension Function بنویسی:fun String.toUrlSafe(): String {
return this.replace(" ", "%20")
.replace("?", "%3F")
.replace("&", "%26")
}
// استفاده
val unsafe = "hello world?query=test&item=1"
val safe = unsafe.toUrlSafe()
println(safe) // hello%20world%3Fquery%3Dtest%26item%3D1✅ این کد یه متد جدید به اسم
toUrlSafe به String اضافه میکنه. درون خودش با this به رشتهی اصلی دسترسی داری و جای کاراکترهای خاص رو با کدهای URL میذاره.🎯 نکته: Extension Functions静态 (static) هستن و override نمیشن. اگر کلاس همون متد رو داشته باشه، اولویت با متد اصلیه.
🔥 بهترین تمرین: از Extension Functions برای جدا کردن منطق کمکی از کلاسهای اصلی استفاده کن، مخصوصاً برای Utility functions.
#ExtensionFunctions #KotlinTips #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
🔍 توابع scope در Kotlin ابزاری قدرتمند برای مدیریت context اشیاء هستن، اما استفاده نادرست ازشون کد رو پیچیده میکنه. بیا با مثال ساده یاد بگیریم! 🚀
توابع scope (
مثال واقعی: فرض کن یه
📌 کد مثال:
✅ توضیح کد:
-
-
-
⚡ نکته کاربردی:
برای زنجیرهسازی عملیات بدون متغیرهای موقت، از
🏷️ #Scope #Kotlin #ScopeFunctions #کاتلین #JVM #AndroidDev
#Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
توابع scope (
let, run, with, apply, also) بهت اجازه میدن عملیات روی یک شیء رو داخل یه بلاک محدود انجام بدی. فرق اصلیشون در نتیجه برگشتی و نحوه دسترسی به شیء هست (با it یا this). 🧩مثال واقعی: فرض کن یه
User داری و میخوای مقادیرش رو ببینی، تغییر بدی و بعد validation کنی. با apply و let میتونی خیلی خواناتر بنویسی.📌 کد مثال:
data class User(var name: String, var email: String)
fun main() {
val user = User("", "")
user.apply {
name = "Sara"
email = "sara@example.com"
}.let {
println("User created: ${it.name}, ${it.email}")
// validation
if (it.email.contains("@")) it else null
}?.run {
println("Valid user: $name")
} ?: println("Invalid email")
}
✅ توضیح کد:
-
apply مقادیر رو تنظیم میکنه و خود شیء رو برمیگردونه. -
let با it به شیء دسترسی داره و نتیجه آخر رو برمیگردونه (اینجا null یا خود شیء). -
run روی شیء غیر null اجرا میشه و با this کار میکنه.⚡ نکته کاربردی:
برای زنجیرهسازی عملیات بدون متغیرهای موقت، از
apply برای تنظیم و let برای پردازش استفاده کن. از also برای side-effects (مثل لاگ) استفاده کن.🏷️ #Scope #Kotlin #ScopeFunctions #کاتلین #JVM #AndroidDev
#Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1
📌 میدونی چرا کلکسیونهای Kotlin محبوبترین ابزار هر دولوپر اندروید هستن؟ 🚀
📚 تو دنیای واقعی، دادهها به صورت لیست، ست یا مپ ذخیره میشن. Kotlin با extension functionهای قدرتمندش مثل
🛠️ بیا با یه مثال عملی ببینیم چطور میشه از
✅ کد بالا اول کاربران بالای ۱۸ رو فیلتر میکنه و بعد فقط اسمشون رو استخراج میکنه. این ترکیب از کلکسیونها باعث میشه کدت خواناتر و دیباگش راحتتر باشه.
💡 نکته حرفهای: همیشه از
#Kotlin #Collections #Filter #Map #Sequence #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
📚 تو دنیای واقعی، دادهها به صورت لیست، ست یا مپ ذخیره میشن. Kotlin با extension functionهای قدرتمندش مثل
map و filter کار رو خیلی راحت کرده. فرض کن یه لیست از یوزرها داری و میخوای فقط اسم اونهایی که سنشون بالای ۱۸ هست رو نشون بدی. 🎯🛠️ بیا با یه مثال عملی ببینیم چطور میشه از
filter و map استفاده کرد:data class User(val name: String, val age: Int)
val users = listOf(
User("Ali", 22),
User("Sara", 17),
User("Reza", 30)
)
val adultNames = users
.filter { it.age >= 18 }
.map { it.name }
println(adultNames) // [Ali, Reza]
✅ کد بالا اول کاربران بالای ۱۸ رو فیلتر میکنه و بعد فقط اسمشون رو استخراج میکنه. این ترکیب از کلکسیونها باعث میشه کدت خواناتر و دیباگش راحتتر باشه.
💡 نکته حرفهای: همیشه از
sequence برای دادههای بزرگ استفاده کن تا عملکرد بهتری داشته باشی. asSequence() رو یادت نره!#Kotlin #Collections #Filter #Map #Sequence #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile