美文网首页
使用runtime将具有相同属性两个类赋值

使用runtime将具有相同属性两个类赋值

作者: WeeverLu | 来源:发表于2019-03-25 00:19 被阅读0次

简单使用runtime将具有相同属性两个类赋值,目前只是简单考虑某些常用属性类型,包含如下:
NSStringNSIntegerNSNumberBOOLNSDateintdoublelongNS_ENUM(NSUInteger, ENUM_NAME)

代码只是拿到属性,找到对应值,直接赋值,同名,不同类型还没考虑,应该还有没考虑的情况

例子:

#import "NSObject+WLClassTransform.h"

AClass *aClass = [[AClass alloc] init];
aClass.xx = @"xx";
aClass.yy = @"yy";

BClass *bClass = [aClass transformToClass:BClass.class];
NSLog(@"bClass.xx=[%@]", bClass.xx); //输出 xx

NSObject+WLClassTransform源码:

  • NSObject+WLClassTransform.h
//
//  NSObject+WLClassTransform.h
//  libWeever
//
//  Created by LuYiHuang on 2019/3/24.
//  Copyright © 2019 Weever. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (WLClassTransform)

/**
 将当前类的属性值,全赋值给toClass对应存在的属性

 @param toClass 需要赋值的Class
 @return toClass的实例对象
 */
- (Class)transformToClass:(Class)toClass;

@end

NS_ASSUME_NONNULL_END
  • NSObject+WLClassTransform.m
//
//  NSObject+WLClassTransform.m
//  libWeever
//
//  Created by LuYiHuang on 2019/3/24.
//  Copyright © 2019 Weever. All rights reserved.
//

#import "NSObject+WLClassTransform.h"
#import "objc/runtime.h"

@implementation NSObject (WLClassTransform)

- (Class)transformToClass:(Class)toClass {
    id model = [[toClass alloc] init];
    
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList(toClass, &outCount);
    for ( int i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *charName = property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:charName];
        id propertyValue = [self propertyValueByName:propertyName]; //循环获取,效率??
        //NSLog(@"%s %@=%@", __func__, propertyName, propertyValue);
        [model setValue:propertyValue forKey:propertyName];
    }
    free(properties);
    
    return model;
}

/**
 获取当前类的存在该属性名对应的属性值

 @param name 查找的属性名
 @return 查找的属性名对应的属性值
 */
- (id)propertyValueByName:(NSString *)name {
    id propertyValue = nil;
    
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList(self.class, &outCount);
    for ( int i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *charName = property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:charName];
        //查找的属性名,是当前类存在的属性
        if ([propertyName isEqualToString:name]) {
            propertyValue = [self valueForKey:(NSString *)propertyName];
            //NSLog(@"%s %@=%@", __func__, propertyName, propertyValue);
            break;
        }
    }
    free(properties);
    
    return propertyValue;
}

@end

相关文章

  • 使用runtime将具有相同属性两个类赋值

    简单使用runtime将具有相同属性两个类赋值,目前只是简单考虑某些常用属性类型,包含如下:NSString、NS...

  • 遍历Model类的属性

    iOS~遍历Model类的属性并完善使用Runtime给Model类赋值 一、获取Model的实体属性 1.要想遍...

  • iOS开发之使用Runtime给Model类赋值

    转载 使用Runtime给Model类赋值 (前提:字典的Key必须和实体类的Property Name相同) 一...

  • iOS-0 一些

    1 iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值 - 简书 2 iOS runti...

  • [iOS]混淆-类名混淆

    使用runtime混淆类名 objc_runtime_name属性可以在编译时,将Class或Protocol指定...

  • iOS开发之 Runtime模型与字典互转

    根据前面的学习iOS开发之使用Runtime给Model类赋值和OC和Swift中的Runtime,总结一下将字典...

  • object is not an instance of dec

    背景 在java中使用反射,将DataFromImp类的属性值赋值给DataToImp类的同名属性。代码示例如下,...

  • 什么是类 具有某些相同属性和行为,被归为同一类。例如:汽车是一个类,具有相同的属性:轮子,发动机,相同的行为:刹车...

  • Java学习笔记 30 - 反射的使用&不同对象的相同属

    使用反射,将不同对象的相同属性值相互赋值。总结三种实用方法:1)使用对象的get,set方法为属性赋值2)使用ja...

  • Java的四个基本特性

    抽象 现实生活中的事物被抽象成对象,把具有相同属性和行为的对象被抽象成类,再从具有相同属性和行为的类中抽象出父类。...

网友评论

      本文标题:使用runtime将具有相同属性两个类赋值

      本文链接:https://www.haomeiwen.com/subject/wwkmvqtx.html