Objective-C/კატეგორიები

ვიკიწიგნებიდან

კატეგორიები არის ყველაზე სასარგებლო თვისება Objective-C-ში. ფაქტობრივად კატეგორიები გაძლევთ საშუალებას დაამატოთ მეთოდები არსებულ კლასში ქვეკლასების შექმნის გარეშე და მათი იმპლემენტაციის დეტალების ცოდნის გარეშე.

ეს უაღრესად სასარგებლოა რადგან თქვენ შეგიძლიათ დაამატოთ მეთოდები ჩადგმულ ობიექტებში. თუ თქვენ გინდათ დაუმატოთ მეთოდი NSString-ის ყველა ეგზემპლარს თქვენს პროგრამაში, თქვენ უბრალოდ ამატებთ კატეგორიას. არანაირი საჭიროება არაა ყველგან გამოვიყენოთ სპეციალურად ამ მიზნისთვის შექმნილი ქვეკლასი.

ასე მაგალითად, მე რომ მინდოდეს მეთოდის დამატება NSString-ში, რომელიც დაადგენდა არის თუ არა ეს ტექსტი ინტერნეტის მისამართი, ეს ასე ჩაიწერებოდა:

#import <Cocoa/Cocoa.h>
            
@interface NSString (Utilities)
- (BOOL) isURL;
@end

ეს ძალიან წააგავს კლასის გამოცხადებას. განსხვავება ისაა, რომ აქ არაა დედა-კლასი და გვაქვს ფრჩხილებში კატეგორიის სახელი. ეს სახელი შეიძლება იყოს რაც მოგესურვებათ, თუმცა ის სასურველია იყოს რაღაც კავშირში იმასთან რასაც ამ კატეგორიაში აკეთებთ.

აი ამის იმპლემენტაცია. თუმცა ეს არაა ინტერნეტ მისამართის იდეალური დამდგენი. ჩვენ უბრალოდ ვცდილობთ გავიგოთ კატეგორიის შინაარსი:

#import "NSString-Utilities.h"
            
@implementation NSString (Utilities)

- (BOOL) isURL
{
    if ( [self hasPrefix:@"http://"] )
        return YES;
    else
        return NO;
}

@end

ახლა თქვენ შეგიძლიათ გამოიყენოთ ეს მეთოდი ნებისმიერ NSString-ზე. შემდეგი პროგრამა გამოიტანს ტექსტ "string1 is a URL" კონსოლში:

NSString* string1 = @"http://pixar.com/";
NSString* string2 = @"Pixar";

if ( [string1 isURL] )
    NSLog (@"string1 is a URL");

if ( [string2 isURL] )
    NSLog (@"string2 is a URL");

ქვეკლასისგან განსხვავებით კატეგორიებს არ შეუძლიათ ეგზემპლარის ცვლადების დამატება. თვენ შეგიძლიათ, სამაგიეროდ, გამოიყენოთ კატეგორიები, კლასში არსებული მეთოდების შესაცვლელად, თუმცა ეს სიფრთხილით უნდა გააკეთოთ.

გახსოვდეთ, რომ როდესაც ახორციელებთ თვისებებს კლასზე კატეგორიების გამოყენებით, ეს ცვლის ამ კლასის ყველა ეგზემპლარს მთელ პროგრამაში.