2016-06-17 3 views
0

это мои методы:Как передать переменные параметры в Objective C

- (void)doSomething:(SEL)aSelector andFormatThings:(NSString *)format, ...; 
- (void)justFormatThings:(NSString *)format, ...; 
- (void)passDouble:(double)aDouble andFormatThings:(NSString *)format, ...; 
- (void)passFloat:(float)aFloat andInt:(int)anInt andFormatThings:(NSString *)format, ...; 

, что я хочу сделать, это передать параметры в моих методах (включая format и ...) по способу, как это:

- (void)formatThings:(NSString *)format, ... { 
    // analysis var list and print formatted string 
} 

Я попытался передать va_list второму методу, но у меня есть ошибка.


вот решение: https://stackoverflow.com/a/2391883/2284065

+0

вызова 'justFormaThings:' от 'DoSomething:' метод, как [само justFormatThings: MyString]; –

+0

Это очень простой, вы должны больше узнать об объективной c. вы можете называть его просто [self justFormatThings: format]; – Pawan

ответ

0

Возможно, этот код поможет.

- (void)doSomething:(SEL)aSelector andFormatThings:(NSString *)format, ... 
{ 
    if (aSelector != NULL && [self respondsToSelector:aSelector]) 
    { 
     [self performSelector:aSelector]; 
    } 

    NSMutableArray *arr = [[NSMutableArray alloc] init]; 

    //store variable argument string in array 
    va_list args; 
    va_start(args, format); 
    for (NSString *arg = format; arg != nil; arg = va_arg(args, NSString*)) 
    { 
     [arr addObject:arg]; 
    } 
    va_end(args); 
    NSLog(@"%@",arr); 

    // call - justFormatThings: 
    [self justFormatThings:[arr componentsJoinedByString:@","],nil]; 
} 
- (void)justFormatThings:(NSString *)format, ... 
{  
    NSMutableArray *arr = [[NSMutableArray alloc] init]; 

    //store variable argument string in array 
    va_list args; 
    va_start(args, format); 
    for (NSString *arg = format; arg != nil; arg = va_arg(args, NSString*)) 
    { 
     [arr addObject:arg]; 
    } 
    va_end(args); 

    NSLog(@"%@",arr); 

} 
-(void)tempMethod 
{ 
    NSLog(@"Temp Method"); 
} 

Вы можете назвать doSomething:andFormatThings: как:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self doSomething:@selector(tempMethod) andFormatThings:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil]; 

} 
+0

thx много. но что, если параметры содержат другие типы? не хотят анализировать его дважды. –

+0

В этой ситуации 'doSomething: andFormatThings:' и 'justFormatThings:' оба метода содержат только аргумент NSString'. –

+0

Вы можете использовать тип 'id' вместо' NSString' в параметре и редактировать мой код в цикле for с 'id' вместо' NSString', чтобы вы могли использовать любой тип данных в аргументе. –

0

Замените код ниже код ...

- (void)doSomething:(SEL)aSelector andFormatThings:(NSString *)format, ... { 
    if (aSelector != NULL && 
     [self respondsToSelector:aSelector]) { 
     [self performSelector:aSelector]; 
    } 
    // call - justFormatThings: 

    [self justFormatThings:anyString]; 

} 

- (void)justFormatThings:(NSString *)format, ... { 
    // code... 
} 
0
- (void)doSomething:(SEL)aSelector andFormatThings:(NSString *)format, ... { 
if (aSelector != NULL && 
    [self respondsToSelector:aSelector]) { 
    [self performSelector:aSelector]; 

} 
// call - justFormatThings: 
    [self justFormatThings:format]; 
} 

- (void)justFormatThings:(NSString *)format, ... { 
// code... 
    } 
+0

thx, но как насчет других параметров ('...') –

0

я упростить это.

Существует несколько способов передачи параметров от функции к другой.

1- В любом из метода 1 вызывается метод второй, как это:

[self justFormatThings:@"you string"]; 

таким образом вы действуете будет вызывать вторую функцию всякий раз, когда вы хотите.

2- Вы объявляете свойство string в .h и используете его всякий раз, когда захотите в своем классе.

например, вы объявляете NSString *myString; в .h , а затем обращаетесь к нему и редактируете/читаете его с обоих методов.

Надеюсь, это поможет!

+0

я не понял, можете ли вы объяснить больше? –