2010-03-20 21 views
18

Her neyse değişken addan dize almak için?

@interface Person : NSObject { NSString *name; } 

benim sınıf içinde cevaplar için

Person *person = [[Person alloc] init]; 
NSLog(@"Name of variable %s\n", _NameofVariable_(person->name)); 

Teşekkür NSString en adını almak gerekir benim sınıf var ki, işte cevaplardan geldi çözüm

//returns nil if property is not found 
-(NSString *)propertyName:(id)property { 
    unsigned int numIvars = 0; 
    NSString *key=nil; 
    Ivar * ivars = class_copyIvarList([self class], &numIvars); 
    for(int i = 0; i < numIvars; i++) { 
     Ivar thisIvar = ivars[i]; 
     if ((object_getIvar(self, thisIvar) == property)) { 
      key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; 
      break; 
     } 
    } 
    free(ivars); 
    return key; 
} 
+0

Ayrıca 'free (ivars) 'olmalıdır veya diziyi sızdırmazsınız. –

+0

iyi yakalamak, bunu yansıtmak için güncellendi. – hacksignal

+0

Bu, sınıfta, girdiğiniz değerle eşleşen herhangi bir mülkün ilk adını döndürmez mi? Örnek: https://gist.github.com/robskillington/684796bae2dd95592919 – rob

cevap

4

Bir sınıfın örnek değişkenlerinin isimlerini Objective-C runtime API işlevi class_copyIvarList ile alabilirsiniz. Ancak, bu, oldukça nadiren yapılır ve neredeyse hiçbir şeyi gerçekleştirmenin en iyi yolu değildir. Sadece meraktan ziyade daha spesifik bir hedefiniz varsa, bunu Objective-C'de nasıl başarılacağını sormak iyi bir fikir olabilir.

Ayrıca, person.name, Objective-C'de bir örnek değişkeni belirtmez - bu bir özellik çağrısıdır. Örnek değişkeni person->name olacaktır.

+0

Örnek değişkenlere bu şekilde erişebileceğinizi bilmiyordum. Muhtemelen asla kullanmayacak, ama bilmek güzel. –

+0

@Brandon bunu yapabilirsin, çünkü Objective-C nesneleri gerçekten sadece yapıdır. :) –

+0

@Dave, Doh! –

0

Kişi nesnesi, sınıfın bir özelliği olarak açığa çıkarsa, aşağıdakileri gerçekleştirmek için objc_msgSend'i kullanabilirsiniz. değer. Eğer

[object person] 

kullanarak kişiyi erişebilir eğer

Yani, Ayrıca mesajın ilgili ayrıntılı bilgi için

objc_msgSend(object, "person") 

Objective-C Runtime Programming Guide section on Messaging

bkz yöntemlere bağımsız değişken nasıl dahil gönderme yapabileceği
2

Sen önişlemci stringification ve dize twiddling biraz kullanabilirsiniz:

NSUInteger lastIndexAfter(NSUInteger start, NSString *sub, NSString *str) { 
    NSRange found = [str rangeOfString:sub options:NSBackwardsSearch]; 
    if(found.location != NSNotFound) { 
     NSUInteger newStart = NSMaxRange(found); 
     if(newStart > start) 
      return newStart; 
    } 
    return start; 
} 

NSString *lastMember(NSString *fullName) { 
    if(!fullName) return nil; 

    NSUInteger start = 0; 
    start = lastIndexAfter(start, @".", fullName); 
    start = lastIndexAfter(start, @"->", fullName); 

    return [fullName substringFromIndex: start]; 
} 

#define NSStringify(v) (@#v) 
#define _NameofVariable_(v) lastMember(NSStringify(v)) 
33

olarak kolay

#define VariableName(arg) (@""#arg)

Sonra yapmanız:

NSObject *obj; 
NSString *str = VariableName(obj); 
NSLog(@"STR %@", str);//obj 
+0

Bunun nasıl çalıştığını açıklayabilir misiniz? :) –

+0

şimdi beklenmedik oldu: D Neyse teşekkürler! –

+1

Bunu deneyen var mı?VariableName'i deneyin (here_s_a_random_string_that_s_not_a_var) Bu bir özellik veya ivar ismini döndürmek için bir yol değildir. Bu, yalnızca bir metnin etrafında @ "" yazmanızdan kurtarmanın bir yoludur ve bunun yerine VariableName() kullanıyorsunuzdur. Yoksa bir şey mi özlüyorum? – mahboudz

0

aşağıdaki eserlerini olarak bir makro:

#define STRINGIZE(x) #x 
İlgili konular