Подклассы 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
здесь на переполнение стека. В следующий раз вы можете немного поискать, прежде чем задать новый вопрос.