2013-02-12 24 views
5

Aynı yöntem adına sahip farklı Object değişkenlerine sahip olduğumuzu varsayalım, fakatve getMethod:(NSString*)aString gibi farklı argüman türleriyle. , seçicideki farklı argüman türleri ileToSelector'ı yanıtlıyor

[myObjectA respondsToSelector:@selector(getMethod:(NSNumber*))] 

Bunu nasıl yaparsınız

: Bir nesne böyle belirli argüman türü, bir şey ile selektör yanıt verirse

nasıl respondsToSelector ile veya başka yoldan kontrol edilir? Teşekkürler.

+3

Aynı adı ve farklı parametre türlerini içeren iki yöntem bildiremezsiniz. –

+0

Tamam, aynı yöntem adıyla, ancak farklı bağımsız değişken türleriyle farklı türde nesneler olduğunu varsayalım. Ne yaparsın peki? –

+0

[Objective-C Runtime Functions] 'ı kullanmanız gerekecek (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/ uid/TP40001418) doğrudan –

cevap

4

Seçici için argümanların tip isimlerini bulmanın birkaç yolu vardır. Örneğin bu kod çalışır:

Method method = class_getInstanceMethod([self class], @selector(someMethod:param2:param3:)); 
char type[256]; 
int argsNumber = method_getNumberOfArguments(method); 
for (int i = 0; i < argsNumber; i++) { 
    method_getArgumentType(method, i, type, 256); 
    NSLog(@"%s", type); 
} 

Birinci ve ikinci günlük argümanlar sistem vardır ve onlara ilgilenmiyor, bu yüzden başka bir ağaç hatları ihtiyacınız vardır.

da aşağıdaki kod örneğine

- (BOOL) someMethod:(NSString *)str param2:(UIView *)view param3:(NSInteger)number 
{ 
    return NO; 
} 

AMA için böyle uygulama olabilir aynı sonucu

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(someMethod:param2:param3:)]; 
int args = [sig numberOfArguments]; 
for (int i = 0; i < args; i++) { 
    NSLog(@"%s", [sig getArgumentTypeAtIndex:i]); 
} 

someMethod:param2:param3: verecektir! Nedeni biz büyük ama burada))) Her iki durumda da bir sembol uzunluğu ile const char * dize ile argümanlar türleri isimleri olacaktır. Derleyici, here açıklandığı gibi tür adını kodlar. Int'ten farklı olabilir, ancak NSString'den UIView'yi değil. Tüm kimlik türleri için, '@' türüne sahip olacaksınız, yani id. Acı ama gerçek. Ne yazık ki, tam bir tam ad veya kod çözme elde etmek için herhangi bir yol bulamadım. Bu şekilde bulacağınız takdirde lütfen bana bildirin.

Yani bu bir çözümdür. Bu yaklaşımı projenizde nasıl kullanacağınızı umuyoruz.

+0

Teşekkür ederim Rost!Cevabınız doğrudan soruma cevap vermiyor olsa bile, Runtime ile çalışmanın ilginç bir yolunu açıklıyor. –

+0

Hope Apple’lar, SDK’nın özellik sürümlerinde gereksinimlerim için bir yöntem yayınlayacak. –

+0

İhtiyaçlarınız, verbose adlandırma felsefelerine ters düştüklerinden şüpheleniyorlar. Benim önerim, sadece ne yaptıklarını belirten isimlere sahip olacak şekilde refactor yapmak. "GetMethodFromNumber:" veya "getMethodFromString:" kadar basit olsa bile – borrrden

0

Sen yöntemleri parametre türünü ayırt edebilmek aslında alışkanlık ama belki bunun yerine böyle bir şey yapabileceğini: Bunu kontrol ettikten beri

if([myObject isKindOfClass:[A class]]) 
    [myObjectA getMethod:aNumber]; 
else if([myObject isKindOfClass:[B class]]) 
    [myObjectA getMethod:aString]; 

Sen alışkanlık seçicinin yanıt olmadığını kontrol etmek gerekir onun doğru tip. Belki de senin problemin bundan daha karmaşıktır, ama eğer işe yaramazsa bu işe yarar.

+0

Aslında benim durumum için istenen iş akışı değil. –