Optional / Nullable — قدر کی عدم موجودگی کے ساتھ محفوظ طریقے سے کام کرنے کے لیے Swift اور Kotlin زبانوں کے میکانزم ہیں۔ Swift میں Optional اور Kotlin میں nullable اقسام ایک ہی مسئلہ — null reference — کو حل کرتی ہیں لیکن مختلف نحوی اور معنوی طریقوں سے۔ Swift.org, 2026 کے مطابق، اختیاری اقسام nil سے متعلق غلطیوں کی پوری کلاس کو ختم کرتی ہیں، null چیک کو مرتب سازی کے مرحلے پر منتقل کرتے ہوئے۔
اہم نکات
Swift میں Optional اور Kotlin میں nullable — یہ زبانی ذرائع ہیں جو null کو قسم کے نظام کا واضح حصہ بناتے ہیں۔ Swift میں، Optional ایک enum ہے: Optional.none (nil) اور Optional.some(Wrapped)۔ Kotlin میں، nullable کو قسم میں لاحقہ ? سے ظاہر کیا جاتا ہے: String? ایک سٹرنگ یا null ہو سکتا ہے۔
دونوں طریقے بنیادی مسئلہ حل کرتے ہیں جسے Tony Hoare نے “ارب ڈالر کی غلطی” کہا — null reference۔ اختیاری اقسام کے آنے سے پہلے، کوئی بھی حوالہ null ہو سکتا تھا، اور چیک ڈویلپر پر چھوڑ دیا جاتا تھا۔ Swift اور Kotlin اس چیک کو مرتب سازی کے مرحلے پر منتقل کرتے ہیں: null کو نظر انداز کرنے والا کوڈ مرتب نہیں ہوگا۔
مشترکہ مقصد کے باوجود، Swift اور Kotlin null-safety کو مختلف طریقے سے لاگو کرتے ہیں۔ Swift مکمل پیٹرن میچنگ کے ساتھ الجبری قسم Optional استعمال کرتا ہے۔ Kotlin علیحدہ ریپر قسم بنائے بغیر کمپائلر کی سطح پر nullable کو قسم کے نظام میں شامل کرتا ہے۔
تاریخی طور پر، null reference 1965 میں ALGOL W زبان میں قدر کی عدم موجودگی کو ظاہر کرنے کے طریقے کے طور پر ظاہر ہوا۔ چھ دہائیوں میں، null بے شمار ناکامیوں کا ذریعہ بن گیا — Tony Hoare کی تحقیق کے مطابق، پروڈکشن کوڈ میں 30 سے 50 فیصد غلطیاں NullPointerException سے متعلق ہیں۔ Optional کے ساتھ Swift اور nullable اقسام کے ساتھ Kotlin پہلی مرکزی دھارے کی زبانیں بن گئیں جنہوں نے قسم کے نظام کی سطح پر اس مسئلے کو حل کیا، null کو فنکشن کے معاہدے کا واضح حصہ بناتے ہوئے۔
Swift میں، Optional ایک مکمل قسم ہے جسے enum Optional<Wrapped> کے طور پر اعلان کیا گیا ہے۔ نحوی شکر ? مکمل اشارے کو بدل دیتی ہے: Int? Optional<Int> کے برابر ہے۔ Optional کے ساتھ کام میں قدر نکالنے کے کئی طریقے شامل ہیں۔
if let — مشروط نکالنا: اگر Optional میں قدر ہے، تو یہ بلاک کے اندر ایک مستقل سے بندھ جاتی ہے۔ guard let — فنکشن سے جلد خروج اگر Optional nil ہے۔ guard let کوڈ کو ہموار رکھتا ہے، نیسٹڈ if-let سے بچاتا ہے۔
Optional chaining (ترتیب وار محفوظ رسائی) ? کے ذریعے واضح unwrapping کے بغیر Optional پر طریقہ یا خاصیت کو کال کرنے کی اجازت دیتا ہے۔ اگر سلسلے کی کوئی کڑی nil ہے، تو پورا سلسلہ nil لوٹاتا ہے۔ یہ درجہ بند ڈیٹا کے ساتھ کام کرتے وقت کوڈ کو کم کرتا ہے۔
?? (nil-coalescing) — ایک آپریٹر جو Optional قدر لوٹاتا ہے اگر وہ nil نہیں ہے، ورنہ — ایک ڈیفالٹ قدر لوٹاتا ہے۔ یہ فال بیک قدر فراہم کرنے کے لیے if-let کا ایک مختصر متبادل ہے۔
var name: String? = "Alice"
// If-let بائنڈنگ
if let unwrapped = name {
print("ہیلو، \(unwrapped)")
}
// Optional chaining
let count = name?.count
// Nil-coalescing
let display = name ?? "مہمان"
// Optional پر Map
let greeting = name.map { "Hello, \($0)" }
Kotlin میں، nullable قسم کے نظام کا حصہ ہے، علیحدہ ریپر قسم نہیں۔ قسم String? null پر مشتمل ہو سکتی ہے، String (سوالیہ نشان کے بغیر) — کبھی نہیں۔ کمپائلر smart cast اور تشریحات کے ذریعے nullable کو ٹریک کرتا ہے۔
?. — محفوظ کال آپریٹر۔ اگر آبجیکٹ null نہیں ہے، تو طریقہ یا خاصیت کال کی جاتی ہے؛ اگر null ہے — بغیر کال کے null لوٹایا جاتا ہے۔ یہ Swift میں optional chaining کے مشابہ ہے، لیکن نحوی طور پر چھوٹا ہے۔
?: — nil-coalescing کا Kotlin-مشابہ۔ اگر بائیں اظہار null نہیں ہے، تو یہ لوٹایا جاتا ہے؛ ورنہ — دائیں طرف کی قدر۔ ایلوس آپریٹر کو اکثر return یا throw کے ذریعے جلد خروج کے ساتھ ملایا جاتا ہے۔
Smart cast — Kotlin کمپائلر if یا when میں null چیک کے بعد خود بخود nullable کو non-null میں تبدیل کر دیتا ہے۔ !! — جبری کال (force unwrap)، جو null پر NullPointerException پھینکتی ہے۔ !! صرف اس وقت استعمال کریں جب null ایک بگ ہو۔
val name: String? = "Alice"
// محفوظ کال
val length = name?.length
// ایلوس آپریٹر
val display = name ?: "مہمان"
// چیک کے بعد Smart cast
if (name != null) {
println("لمبائی: ${name.length}")
}
// لیمبڈا کے ساتھ Let
name?.let { println("ہیلو، $it") }
// Force unwrap — صرف جب یقین ہو
val forced = name!!
اگرچہ Swift اور Kotlin ایک ہی کام حل کرتے ہیں، null-safety کے بارے میں ان کے نقطہ نظر بنیادی طور پر مختلف ہیں۔ ان فرقوں کو سمجھنا دونوں پلیٹ فارمز پر کام کرنے والے ڈویلپرز کے لیے اہم ہے۔
Swift enum Optional — ایک معیاری الجبری قسم استعمال کرتا ہے۔ Kotlin ریپر آبجیکٹ بنائے بغیر کمپائلر قسم کے نظام کی سطح پر nullable کو شامل کرتا ہے۔ یہ کارکردگی کو متاثر کرتا ہے: Swift میں Optional ڈھیر پر ایک آبجیکٹ ہے، Kotlin میں nullable مختص کیے بغیر null چیک ہے۔
Kotlin نحو بلٹ ان آپریٹرز ?., ?:, !! کی وجہ سے چھوٹا ہے۔ Swift کو زیادہ واضح نحو کی ضرورت ہے: if let، guard let، Optional پر map۔ تاہم، Swift switch کے ذریعے پیٹرن میچنگ فراہم کرتا ہے، جسے Kotlin nullable کے لیے براہ راست سپورٹ نہیں کرتا۔
| منظر | Swift | Kotlin |
|---|---|---|
| اعلان | var name: String? | val name: String? |
| محفوظ کال | name?.count | name?.length |
| ڈیفالٹ قدر | name ?? “مہمان” | name ?: “مہمان” |
| مشروط نکالنا | if let x = name | name?.let { x -> } |
| Force unwrap | name! | name!! |
موبائل ڈویلپمنٹ میں، اختیاری اقسام کے ساتھ کام کرنے کے معیاری پیٹرن تیار ہوئے ہیں جو بوائلرپلیٹ کوڈ کو کم کرتے ہیں اور حفاظت بڑھاتے ہیں۔
Swift اور Kotlin Optional اور nullable کے لیے map اور flatMap کو سپورٹ کرتے ہیں۔ اگر قدر موجود ہے — تبدیلی لاگو کی جاتی ہے، اگر null ہے — null لوٹایا جاتا ہے۔ یہ نیسٹڈ if-let چیکس کو ختم کرتا ہے۔
if-let + else کے بجائے ڈیفالٹ قدر کے ساتھ ?: یا ?? استعمال کریں۔ یہ کوڈ کو اعلانیہ بناتا ہے: “اگر دستیاب ہو تو X استعمال کریں، ورنہ Y” طریقہ کار چیک کے بجائے۔
Jetpack Compose اور SwiftUI میں، اختیاری اقسام رینڈرنگ کو کنٹرول کرتی ہیں: اگر حالت null ہے — جزو چھپائیں، ورنہ دکھائیں۔ یہ واحد سچائی کا ذریعہ اصول کی پیروی کرتا ہے۔
data class UserState(
val name: String?,
val email: String?
)
// مختلف تغیرات کے ساتھ when میں Smart cast
fun greeting(state: UserState): String = when {
state.name != null && state.email != null ->
"${state.name} (${state.email})"
state.name != null -> state.name
else -> "مہمان"
}
// Compose: موجودگی کے مطابق ڈسپلے
@Composable
fun UserProfile(name: String?) {
name?.let {
Text(text = it)
} ?: Text(text = "ڈیٹا نہیں")
}
موجودہ Java کوڈ کو Kotlin میں منتقل کرنے کے لیے، androidx.annotation پیکیج سے @Nullable اور @NonNull تشریحات استعمال کرنے کی سفارش کی جاتی ہے۔ Kotlin کمپائلر Java کے ساتھ interop کے دوران ان تشریحات کو مدنظر رکھتا ہے، خود بخود متعلقہ اقسام کو nullable یا non-null بناتا ہے۔ واضح تشریحات کے ساتھ بتدریج منتقلی پروجیکٹ میں عالمی طور پر null-safety کو فعال کرنے سے زیادہ محفوظ ہے۔
Null-safety غلطیوں کی تعداد کو کم کرتا ہے، لیکن انہیں مکمل طور پر ختم نہیں کرتا۔ ڈویلپرز اکثر اختیاری اقسام کے ساتھ کام کرتے وقت خصوصی غلطیاں کرتے ہیں۔
اکثر پوچھے گئے سوالات
Swift Optional some اور none کیسز والا enum ہے، ڈھیر پر آبجیکٹ۔ Kotlin nullable قسم کے نظام میں ایک تشریح ہے، ریپر بنائے بغیر کمپائلر کے ذریعے چیک کیا جاتا ہے۔ Kotlin نحوی طور پر زیادہ جامع ہے، Swift پیٹرن میچنگ میں زیادہ طاقتور ہے۔
Java میں بلٹ ان null-safety نہیں ہے۔ Optional (Java 8+) Swift Optional سے ملتا جلتا ہے، لیکن یہ اوورہیڈ والا ریپر ہے۔ @Nullable اور @NonNull تشریحات جامد تجزیہ کار کی مدد کرتی ہیں، لیکن حفاظت کی ضمانت نہیں دیتیں۔
?.let آپریشنز کی زنجیر کے لیے آسان ہے: تبدیلی لاگو کرنا، ڈیٹابیس میں محفوظ کرنا، UI اپ ڈیٹ کرنا — سب ایک بلاک میں۔ متعدد nullable متغیرات والی پیچیدہ شرائط کے لیے null چیک کے ساتھ if بہتر ہے۔
Swift Optional بڑی اقسام کے لیے بالواسطہ ذخیرہ والا enum ہے، جو مختص کا سبب بن سکتا ہے۔ Kotlin nullable اضافی لاگت کے بغیر null چیک ہے۔ گرم راستوں (recycler view، اینیمیشن) کے لیے Kotlin زیادہ کارآمد ہے۔
Nullable صرف اس وقت استعمال کریں جب فیلڈ واقعی غائب ہو سکتا ہے: اختیاری پروفائل ڈیٹا، غیر لازمی ترتیبات۔ اگر فیلڈ ہمیشہ بھرا جاتا ہے، تو تخلیق کے وقت ایلوس آپریٹر کے ذریعے ڈیفالٹ قدر کے ساتھ non-null استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں