2

私は次のクラスを持っています。

@interface classB : classA

@property NSString* token;


@end

@interface classA 

@property NSString* name;
@property float email;

@end

私は基本的に、継承された(classA)がclassAの別のインスタンスのコピーであるclassBのインスタンスを作成したいと考えています。プロパティごとに手動でコピーする必要はありません。

copyWithZone を試してみましたが、それが正しい道だとは思いません。

4

1 に答える 1

1

これを自動的に魔法のように行う方法があるとは思いません。ただし、この質問 (プロパティ値を自動的にコピー... )への回答に基づいて、使用できるかなり単純な方法を思いつくことができました。

まず、クラスが 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 *により、すべてのプロパティ名がNSStrings として取得されます。

次に、クラス 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;
}
于 2013-08-02T19:27:37.687 に答える