دسته ها (Category ها)

دسته ها به شما اجازه می دهند که بدون این که لازم باشد یک زیر کلاس ایجاد کنید یا سورس کد یک کلاس را تغییر دهید، متد های جدید را به کلاس اضافه کنید. متد یا متد های جدید، به محض لود شدن دسته، بخشی از تمامی instance های آن کلاس خواهند شد.
این ویژگی در بسیاری از سناریو ها مفید خواهد بود. برای مثال هنگامی که بخواهید به کلاس های درون ساخت، متدهای جدید اضافه کنید. مثلا فرض کنید می خواستید کلیه ی آبجکت های CPString دارای یک متد باشند که معکوس رشته را برگرداند. می توانستید یک دسته مانند زیر ایجاد کنید:

mk

اکنون می توانید متد reverse را بر روی هر رشته ای فراخوانی کنید و رشته‌ی معکوس را بدست بیاورید.

jh

طریقه ی ایجاد دسته به این صورت است که ابتدا می نویسیم @implementation و سپس نام کلاسی که می خواهیم به آن متد اضافه کنیم را می نویسیم و سپس نام دسته را در درون پرانتز قرار می دهیم. در انتهای تعریف دسته هم، @end می آید. هر متدی که پیش از @end اضافه شده باشد، بخشی از دسته خواهد بود. توجه کنید که به کمک دسته ها نمی توانید متغیر های instance را به کلاس اضافه کنید. با این حال، به دلیل طبیعت پویای اشیای جاوا اسکریپت، می توان متغیر های مورد نظر را به طور مستقیم با دستکاری خصوصیات شی، به آبجکت اضافه کرد:

 

foo

جالب است که به برخی از تکنیک های استفاده شده در تعریف متد reverse در بالا توجه کنیم.
برای مثال، متغیر reversedString درست همانند تمامی رشته های عادی جاوا اسکریپت تعریف شده است. این ویژگی به مدد تکنیکی به نام “پل زنی بدون عوارض” (toll-free bridging) به وجود آمده است که اجازه می دهد هر آبجکتی در جاوا اسکریپت مانند آرایه یا رشته، در آن واحد هم بتواند به عنوان یک آبجکت جاوا اسکریپت عادی عمل کند و هم به عنوان یک آبجکت کاپوچینو مورد استفاده قرار بگیرد. به این ترتیب یک رشته ی عادی جاوا اسکریپت هم می تواند به متد های CPString مانند length و charachterAtIndex پاسخ دهد و هم متد های اصلی جاوا اسکریپت مانند عملگر الحاق رشته (+) قابل استفاده باشند.