Могу ли я объявить метод с аргументами с неизвестными типами? - PullRequest
2 голосов
/ 22 марта 2012

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

Допустим, у меня есть метод, который выглядит следующим образом:

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(NSString *) is {

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ = '%@')", where, is];

   return [self retrieveDataFrom:name withPredicate:predicate];
}

и затем иногда я хочу сделать что-то вроде этого (например):

[self retrieveDataFrom:@"table" where:@"id" is:int 2];

вместо этого:

[self retrieveDataFrom:@"table" where:@"id" is:@"2"];

Есть ли способ получить метод для принятияаргумент, не зная его тип?

Ответы [ 4 ]

2 голосов
/ 22 марта 2012

Не напрямую. Вы можете объявить входные данные как NSObject *, так что они могут принимать NSString * или NSNumber *, но вы все еще застряли, используя уродливый синтаксис NSNumber.

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];

Однако улучшенный синтаксис скоро появится в виде Clang Language Extensions .

Когда эти земли, вы сможете написать это вместо:

[self retrieveDataFrom:@"table" where:@"id" is:@2];

В настоящее время на сайте LLVM говорится, что они будут в версии llvm 4.0. Умные деньги говорят, что это будет в Xcode 4.4, но я сомневаюсь, что Apple обязана заявлению на веб-сайте LLVM.

1 голос
/ 22 марта 2012

Нет. В лучшем случае вы можете позволить ему принимать любой тип obj-c, используя id, но вы не можете иметь аргумент accept любого типа . Единственное исключение - использование varargs, но даже в этом случае метод нуждается в некотором способе узнать, какой тип аргумента ожидать, прежде чем он даже посмотрит на аргумент (например, методы printf -style используют форматную строку, чтобы выяснить тип аргумент будет).

Если вы используете id, ваш метод будет выглядеть как

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is;

И ваше использование будет выглядеть как

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]];

Или с новыми литералами target-c ,

[self retrieveDataFrom:@"table" where:@"id" is:@2];
1 голос
/ 22 марта 2012

Просто используйте (id) вместо (NSString *)

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(id) is 
0 голосов
/ 22 марта 2012

Использовать (id)

- (NSArray*)retrieveDataFrom:(id) name where:(id) whereIs:(id)is {
  ...
}

или пройти (NSArray *)

- (NSArray*)retrieveDataFrom:(NSArray*) params {
  ...
}
...