Как создать NSArray (или NSMutableArray) методов класса в Objective C?

Предположим, что у вас есть эта строка, сохраненная в переменной с именем myString.

String myString = "core/pages/viewemployee.jsff";
String newString = myString.substring(myString.lastIndexOf("/")+1, myString.indexOf("."));      

Но вам нужно сделать такой же контроль перед тем, как делать substring в этом, потому что, если нет, эти символы вы получите из lastIndexOf() или indexOf() a "-1", которые нарушат ваш вызов substring.

Предлагаю вам посмотреть документацию Javadoc .

14
задан Peter Mortensen 16 November 2009 в 13:52
поделиться

3 ответа

Use NSValue.

For example:

NSArray* handlers = [NSArray arrayWithObjects:[NSValue valueWithPointer:handleA] ... ];

then to access :

handleptr* handle = (handlerptr*)[[handlers objectAtIndex:0] pointerValue];
handle(foo_bar);
6
ответ дан 1 December 2019 в 07:06
поделиться

Проблема здесь состоит в том, что для привязки тех функций необходимо использовать селекторное ключевое слово, которое возвращает тип SEL. Это - тип указателя, тогда как NSArray хранит объекты.

у Вас таким образом есть три опции;

  1. Использование регулярный массив C-типа
  2. Сгиб функции в производный класс NSObject, который назовет их.
  3. Использование протокол.

второе вероятно более хорошее, и для этого можно использовать класс NSValue для содержания селекторных результатов. Например;

NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)];
NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)];

NSArray *handler_table = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ];

то, Когда Вы получили корректную запись от массива, для преобразования назад Вас, сделало бы;

SEL mySelector = [selCommand pointerValue];
[someObject performSelector:mySelector];

(Отмечают, что я предполагаю, что от Вашего объективного синтаксиса C, что они предназначаются, чтобы использоваться в качестве методов на объекте и не глобальных функциях. Если Вы хотите использовать их глобально затем, необходимо записать им, как Вы были бы в плоскости C.)

Другая опция состоит в том, чтобы формализовать методы команды в протокол. Это позволяет Вам писать функциональность, которая будет работать над любым объектом, который реализует тот протокол, и компилятор обеспечит больше проверки, чем если бы Вы просто называли селекторы.

, Например,

// some header
@protocol CommandHandler
@required
-(void) handleCommandA;
-(void) handleCommandB;
@end

// some other header
@interface someClass : NSObject<CommandHandler>
{
// you will receive compiler warnings if you do not implement the protocol functions
}

Ваш код обработки и отправки затем написан для работы с объектами типа "CommandHandler". Например,

-(void) registerForCommands:(CommandHandler*)handler
29
ответ дан 1 December 2019 в 07:06
поделиться

В Objective C Вы не раздаете методы; Вы раздаете селекторы , которые являются в основном каноническими именами методов. Затем чтобы заставить объект ответить на селекторное сообщение, Вы отправляете его performSelector:. Например:

NSString *exampleString = [NSString stringWithString:@"Hello"];
SEL methodName = @selector(stringByAppendingString:);
  // ^This is the selector. Note that it just represents the name of a
  //  message, and doesn't specify any class or implementation
NSString *combinedString = [exampleString performSelector:methodName withObject:@" world!"];

то, Что Вы захотите, должно сделать массив NSStrings, содержащего названия селекторов, которыми Вы интересуетесь. Можно использовать функцию NSStringFromSelector(), чтобы сделать это. Затем когда Вы захотите использовать их, звоните NSSelectorFromString() на строках, чтобы вернуть исходный селектор и передать его соответствующему объекту performSelector:. (Как показано в примере выше, получатель не кодируется в селекторе — просто имя метода —, таким образом, Вы, возможно, должны были бы сохранить получатель также.)

4
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: