Подклассы NSString

Используя WSDL2ObjC я получаю много классов, которые являются подклассами NSString. Я нахожу трудным инициализировать значение NSString любого объекта этих классов.

Скажи, что мой класс выглядит так:

@interface mClass ; NSString {
     int value;
}

Теперь в моем коде я хотел бы использовать объекты mClass как NSString, а также использовать его значение атрибута, которое является целым числом.

Как я могу это сделать?

Я пытаюсь использовать такой код

 mClass *obj = [[mClass alloc] initWithString:@"Hello"];

Но он показывает мне ошибку, говоря, что я использую абстрактный объект класса, вместо этого я должен использовать конкретный экземпляр.

3 ответа

Если вам действительно нужно сделать подкласс NSString, вы должны переопределить 3 метода:

- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length freeWhenDone:(BOOL)freeBuffer;
- (NSUInteger)length;
- (unichar)characterAtIndex:(NSUInteger)index;

Например:

MyString.h

@interface MyString : NSString 

@property (nonatomic, strong) id myProperty;

@end


MyString.m

@interface MyString ()

@property (nonatomic, strong) NSString *stringHolder;

@end

@implemenation MyString

- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length freeWhenDone:(BOOL)freeBuffer {
    self = [super init];
    if (self) {
        self.stringHolder = [[NSString alloc] initWithCharactersNoCopy:characters length:length freeWhenDone:freeBuffer];
    }
    return self;
}

- (NSUInteger)length {
    return self.stringHolder.length;
}

- (unichar)characterAtIndex:(NSUInteger)index {
    return [self.stringHolder characterAtIndex:index];
}

@end

Может быть разумнее использовать класс-оболочку, которая внутренне использует строки NSS для выполнения любых операций или манипуляций, которые вы пытаетесь выполнить. Однако это приведет к необходимости перегрузить любую функциональность NSString, которую вы хотите (например, получить длину строки).

Или вы можете создать категорию NSString (находится прямо рядом с классом Objective-C в новом окне файла). Это позволяет вам добавлять любые свойства или методы, которые вы хотите "добавить" в класс NSString. Теперь просто импортируйте эту категорию туда, где вы хотите ее использовать, и все ваши пользовательские функции будут доступны для любых объектов NSStrings.

Вы действительно должны подкласс NSString? Это кластер классов, что (помимо всего прочего) означает, что его трудно разделить на подклассы. Есть хороший пост Майка Эша о подклассе кластеров классов. Если вы не знали, что кластеры классов существуют, вы, вероятно, новичок в Какао, и в этом случае лучший короткий ответ - не пытайтесь создавать подклассы кластеров классов.

Там также предыдущие вопросы о подклассе NSString здесь на переполнение стека. В следующий раз вы можете немного поискать, прежде чем задать новый вопрос.

Другие вопросы по тегам