داریوش فتحی
داریوش فتحی
خواندن ۲ دقیقه·۶ سال پیش

چند extension کاربردی برای صرفه جویی در زمان برنامه نویسان Android - قسمت سوم (ادامه دارد..)

این سومین قسمت از "چند extension کاربردی برای صرفه جویی در زمان .... " است . لینک دو قسمت قبلی را می توانید در زیر مشاهده کنید :

در قسمت اول این سری اشاره کردیم که extension ها رو کجا و چطوری ذخیره و مدیریت کنید بهتره . خالی از لطف نیست اگر نیم نگاهی به قسمت اول بندازید .

بدون مقدمه میرم سر اصل مطلب !

تا بحال از clipboard استفاده کردید ؟

توی یه جمله بگم clipboard یه متن رو کپی میکنه که بعدا میتونیم paste کنیم

راه حل extension ی :

fun Context.copyToClipboard(text: CharSequence) { val clipboard = this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("label", text) clipboard.primaryClip = clip }

برای کپی کردن یه رشته داخل clipboard کافیه copyToClipBoard را فراخوانی کنید و رشته مورد نظر رو به عنوان پارامتر بهش پاس بدید . مث قطعه کد زیر :

copyToClipboard("abcdefghijklmnopqrstuvwyz" as CharSequence) // or val myString = "abcdefghijklmnopqrstuvwyz" copyToClipboard(myString as CharSequence)

یه نکته مهم

به تعریف تابع ()Context.copyToClipboard توجه کنید .به Context ای که به اول متد اضافه شده receiver میگیم . به چه معنیه ؟

این receiver مشخص میکنه که چه کلاس ها یا نمونه هایی از یک کلاس میتونن این متد رو فراخوانی کنن . دلیل این که محدود کردیم چه کلاس هایی از این متد استفاده کنن اینه که به خود اون کلاس نیاز داریم !

مثلا برای متدی که در بالا تعریف شده receiver ما باید از نوع Context باشه . یعنی فقط کلاس ها یا نمونه هایی از کلاس هایی که از جنس Context هستند یا از Context مشتق گرفته شده اند (Activity , Service Application و ....) می توانند copyToClipBoard را فراخوانی کنند . کلمه this داخل متد copyToClipBoard به receiver اشاره میکنه

حالا اگر کلاسمون از جنس Context نبود چی ؟

اگر کلاس میزبان از جنس Context نبود باید حداقل یه نمونه از Context داشته باشیم و به این صورت copyToClipBoard رو فراخوانی می کنیم :

context.copyToClipboard("abcdefghijklmnopqrstuvwyz" as CharSequence)

البته این روش زیاد جالب نیست (به نظر من)

پس بیایید تابع copyToClipBoard رو یه مقدار تغییر بدیم . مثلا اینطوری :

fun String.copyToClipboard(context : Context) { val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("label", this as CharSequence) clipboard.primaryClip = clip }

خوب receiver مون در تابع جدید از نوع String ه . یعنی هر رشته ایی از نوع String میتونه copyToClipboard رو فرخوانی کنه . ولی در نهایت باز هم نیاز به Context که به صورت پارامتر باید پاس داده بشه (در نسخه قبلی Context خود receiver بود) . به نمونه کد زیر توجه کنید :

"abcdefghijklmnopqrstuvwyz".copyToClipboard(this /* context instance */) // or val myString = "abcdefghijklmnopqrstuvwyz"" myString.copyToClipboard(this /* context instance */)

اگر متوجه نشدید که receiver واقعا چیه تابع جدید رو با نسخه قدیمی مقایسه کنید .

این پست همچنان ادامه دارد ....

روز/شب خوبی داشته باشید

kotlinandroid
توسعه دهنده اندروید و دوست دار طبیعت
شاید از این پست‌ها خوشتان بیاید