Эквивалент в Objective c из BeanUtils.copyProperties.

Я хотел бы знать, есть ли у них эквивалент в Цели C метода JAVA "BeanUtils.CopyProperties (bean1, Bean2);" ?

Или другое решение, я бы хотел привести motherObject к childObject:

@interface motherBean : NSObject{ ...}
@interface childBean : motherBean { ...}

motherBean m = [motherBean new];
childBean f = m;

С первыми тестами это работает, но у меня есть предупреждение: «возвращаются несовместимые типы указателей ...»;

Я использую WSDL2Objc, и он генерирует бин, и его имя может меняться между двумя поколениями: - /

Я предпочитаю работать с ребенком и просто изменить имя в ее определении

Благодарност

Энтон

Ответы на вопрос(3)

Решение Вопроса

Метод BeanUtils.copyProperties

//.h
#import <Foundation/Foundation.h>
#import <objc/runtime.h>


@interface BeanUtils : NSObject

+(void)copyProperties:(id)src dest:(id)dest;

@end
//.m
#import "BeanUtils.h"

@implementation BeanUtils

+(void)copyProperties:(id)src dest:(id)dest {

    NSLog(@"classeSrc=%@ dst=%@", [src class], [dest class]);
    if(src == NULL || dest == NULL) {
        return;
    }

    Class clazz = [src class];
    u_int count;

    objc_property_t* properties = class_copyPropertyList(clazz, &count);
    NSMutableArray* propertyArray = [NSMutableArray arrayWithCapacity:count];
    for (int i = 0; i < count ; i++)
    {
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(properties[i])];
        [propertyArray addObject:propertyName];

        //on verifie que la prop existe dans la classe dest
         objc_property_t prop = class_getProperty([dest class], [propertyName UTF8String]);
        if(prop != NULL) {
            id result = [src valueForKey:propertyName];
            [dest setValue:result forKey: propertyName];
        }
        else {
            [NSException raise:NSInternalInconsistencyException format:@"La propriété %@ n'existe pas dans la classe %@",propertyName, [dest class] ];
        }
    }
    free(properties);    
}

@end

вызов

EleveBean  *eleveBean = [EleveBean new];
eleveBean.nom = @"bob";
eleveBean.prenom = @"john";
tns1_EleveBean *tnsEleve = [tns1_EleveBean new];

[BeanUtils copyProperties:eleveBean dest:tnsEleve];
STAssertEquals(eleveBean.nom, tnsEleve.nom, @"");
STAssertEquals(eleveBean.prenom, tnsEleve.prenom, @"");

вы можете легко написать код для копирования значений свойств между экземплярами. Проще всего, если вы ограничите свойства соответствующими свойствами Objective-C (элементы, объявленные с использованием @property ()), что, вероятно, в любом случае является наилучшей практикой. Вы можете использовать функции времени выполнения Objective C, чтобы получить список всех свойств класса (class_getPropertyList) и вызвать property_getName (), чтобы получить имя свойства, и вызвать property_getAttributes (), чтобы убедиться, что оно доступно для записи. Затем вы можете использовать NSObject Key Value Coding для получения и установки значений свойств, используя valueForKeyPath: и setValueForKeyPath: соответственно.

Некоторые проблемы с вашим примером кода заключаются в том, что экземпляры должны быть указателями. Во-вторых, вам нужно явное приведение, так как вы назначаете экземпляр класса его суперклассу. Обратное не потребовало бы броска. Вероятно, поэтому вы получаете предупреждение.

 Anthone05 июн. 2012 г., 09:42
Я надеялся, что метод уже существует. Я пишу один и пост здесь

опирования. Особенно

PropertyUtils.copyProperties(bean1, bean2);

Однако, что касается твоего второго вопроса, ты пытаешься передать экземпляр родительского класса в дочерний класс?

Я не уверен, как это будет законно на любом языке ОО. Конечно, вы можете принудительно разыграть:

// This is not legal because you can't case from one class to anther
// unless the actual instance type (not the declared type of the variable,
// but the constructed type) is either the casted class or a subclass.
Parent p = new Parent();
Child c = (Child) p;

Но вы получите ClassCastException, поскольку вы не можете обрабатывать экземпляр родительского класса, как если бы он был дочерним классом (только наоборот). Однако любой из них будет законным:

// This is legal because you're upcasting, which is fine
Child c = new Child();
Parent p = c;

// This is legal because the instance "p" is actually an
// instance of the "Child" class, so the downcast is legal.
Parent p = new Child();
Child c = (Child) p;
 Anthone05 июн. 2012 г., 09:40
спасибо за ваш ответ, что причина, почему я ищу эквивалент BeanUtils.CopyProperties (bean1, Bean2); (или PropertyUtils.copyProperties (bean1, bean2) это тоже самое думает) но в Objective c нет в Java

Ваш ответ на вопрос