Предположим, что у вас есть эта строка, сохраненная в переменной с именем myString
.
String myString = "core/pages/viewemployee.jsff";
String newString = myString.substring(myString.lastIndexOf("/")+1, myString.indexOf("."));
Но вам нужно сделать такой же контроль перед тем, как делать substring
в этом, потому что, если нет, эти символы вы получите из lastIndexOf()
или indexOf()
a "-1", которые нарушат ваш вызов substring
.
Предлагаю вам посмотреть документацию Javadoc .
Use NSValue.
For example:
NSArray* handlers = [NSArray arrayWithObjects:[NSValue valueWithPointer:handleA] ... ];
then to access :
handleptr* handle = (handlerptr*)[[handlers objectAtIndex:0] pointerValue];
handle(foo_bar);
Проблема здесь состоит в том, что для привязки тех функций необходимо использовать селекторное ключевое слово, которое возвращает тип SEL. Это - тип указателя, тогда как NSArray хранит объекты.
у Вас таким образом есть три опции;
второе вероятно более хорошее, и для этого можно использовать класс 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
В 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:
. (Как показано в примере выше, получатель не кодируется в селекторе — просто имя метода —, таким образом, Вы, возможно, должны были бы сохранить получатель также.)