متدهای پرکاربرد scope functions در کاتلین
23 مهر 1399 1399-07-23 9:35متدهای پرکاربرد scope functions در کاتلین
متدهای پرکاربرد کاتلین که به اصلاح اونارو با scope functions میشناسیمشون خیلی کاربردی و جذاب هستن.
اگه نحوه کارکردن با این Functionها رو بدونی اون موقعس که تازه به قدرت واقعی کاتلین پی میبری و میبینی که چقدر کارها رو راحتتر و از همه مهمتر حرفه ای تر میکنه.
این متدهای پرکاربرد شامل Let , Run , Also , Apply , With میشن که میخوام توی این مطلب درموردشون توضیح بدم.
عملکرد بعضی از این متدهای شاید توی نگاه اول عین هم باشه، ولی یکسری فرق های عمده دارن که توی این مطلب باهم کامل بررسیش میکنیم.
توی این مطلب صرفا میخوام به صورت اجمالی هرکدوم از این متدها رو بررسی کنم، توی مطالب آینده حتما به طور دقیق و کامل هر کدوم از این متدها رو بررسی میکنم و میگم که باید در چه شرایطی از کدوم یکی از این متدها استفاده کنی.
1) Let :
وقتی روی یه آبجکت صدا بشه، داخل لمبدا میتونی به context اون شی بعنوان it دسترسی پیدا کنی.
استفادههای خیلی زیادی از این تابع میشه کرد، یکی از استفاده مهمش توی null checking هستش که روی یه آبجکت زنجیزهای از متدها رو میخوایم صدا بزنیم.
if (fragmentManager != null) { fragmentManager?.beginTransaction().add(##).addToBackStack(##).commit() doSomething() }
سناریو بالا رو اینسری با let مینویسیم
fragmentManager?.let{ it.beginTransaction().add(##).addToBackStack(##).commit() doSomething() doSomethingElse() }
در واقع it اشاره به آبجکت fm داره که توی بلاک let بهش دسترسی داریم و کد درون let.? تنها وقتی اجرا میشه که fm از ابتدا null نباشه.
let در حقیق خود لمبدا رو برمیگردونه. اینطوری بدون نوشتن if راحت میتونیم null check انجام بدیم 😎
2) Apply :
تفاوت apply با let این هست که بجای it از this استفاده میشه و خود آبجکت رو برمیگردونه.
نکتش اینه که بدون صدا زدن this میتونیم متدهای خود آبجکت رو داخل لمبدا صدا بزنیم و اونا رو بقولی apply کنیم روی آبجکت.
val recyclerView = findViewById(##) recyclerView.layoutManager = ## recyclerView.itemAnimator = ## recyclerView.adapter = ###
خیلی از وقتها پیش میاد که آبجکتی رو بسازیم و مثل بالا مجبور باشیم عمل کنیم.
اما راه بهتری که Scopeهای کاتلین در اختیار ما میزاره استفاده از apply هست، که همون موقع که آبجکت رو داریم استفاده میکنیم همزمان یکسری کار دیگر هم درش انجام بدیم.
مثل زیر:
val recyclerView = findViewById(##).apply{ layoutManager = ## itemAnimator = ## adapter = ## }
3) Also :
این برای وقتی خوبه که روی یک آبجکت داریم کاری میکنیم یا تغییری میدیم و بعدش میخوایم بگیم همچنین (also) یک کار دیگه هم بکن.
val result = service.add(#) doSomethingWithResult(result)
مثال بالا service.add یه کاری رو انجام میده و بعدش بهمون یک چیزی هم میده که با استفاده از also هم میشه نوشت:
service.add(کد موردنظر شما).also { doSomethingWithResult(it) }
4) Run :
این هم مثل let هست و همونطوری عمل میکنه با این تفاوت که this (خود کانتکست آبجکت) رو برمیگردونه
val date: Int = Calendar.getInstance().run { set(Calendar.YEAR, 2030) get(Calendar.DAY_OF_YEAR) }
5) With :
این خیلی مثل apply هست با این تفاوت که معمولا یک نمونش برای وقتی هست که property های یک آبجکت رو میخوایم عوض کنیم.
var person = Person("Mohammad", "Nouri") person.name1 = "No Name" person.name2 = "No Name"
که با with به شکل زیر میشه
var person = Person("Mohammad", "Nouri") with(person) { name1 = "No Name" name2 = "No Name" }
این Scope functionها خیلی مهم هست. پس سعی کن خوب یادبگیر و حتما ازشون استفاده کن.
دیدگاه (2)
حسن
خیلی مفید بود. واقعا ممنونم. با اینکه معمولا توی پیج تون کامنت میذارم. خواستمم تشکری هم بکنم.
یه نکته ای که در آموزش های شما هست اینه که موضوعاتی که ذهن رو درگیر میکنن رو خیلی خوب و خلاصه آموزش میدید.
موضوعات تون رو وقتی میبنم دقیقا چیزی هست که خودم باهاشون چالش داشتم و بعضا خیلی طول کشید تا متوجه میشم.
محمد نوری
خیلی مخلصیم آقا حسن گل. شما لطف داری نسبت به بنده.
سعی میکنم درآینده حتما موضوعات چالشی و خاص اندروید رو بیشتر توضیح بدم