これを自動的に魔法のように行う方法があるとは思いません。ただし、この質問 (プロパティ値を自動的にコピー... )への回答に基づいて、使用できるかなり単純な方法を思いつくことができました。
まず、クラスが NSObject から継承されていると仮定して、次のメソッドを使用して NSObject にカテゴリを追加します (または、このメソッドをクラス A に追加することもできます)。
#import <objc/runtime.h>
- (NSSet *)propertyNames
{
NSMutableSet *propNames = [NSMutableSet set];
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
[propNames addObject:propertyName];
}
free(properties);
return propNames;
}
これNSSet *
により、すべてのプロパティ名がNSString
s として取得されます。
次に、クラス B に対して、クラス A を入力として受け取り、クラス B のインスタンスを初期化し、クラス A のプロパティ名を反復処理して、それらをクラス B にコピーする次のメソッドを作成します。
- (id)initWithClassA:(ClassA *)classA
{
self = [super init];
if(self)
{
NSSet *propertyNames = [classA propertyNames];
for(NSString *propertyKey in propertyNames)
{
id value = [classA valueForKey:propertyKey];
[self setValue:[value copy] forKey:propertyKey];
}
}
return self;
}