این سومین قسمت از "چند 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 واقعا چیه تابع جدید رو با نسخه قدیمی مقایسه کنید .
این پست همچنان ادامه دارد ....
روز/شب خوبی داشته باشید