Swift和Objective-C的runtime的差异

来源:互联网 发布:淘宝用户服务协议 编辑:程序博客网 时间:2024/06/07 12:07

最近写swift的时候,用到了一些运行时的东西,但是有部分与oc还是有差异的,得不到想要的东西,于是记录一下目前自己遇到的两者之间的差别。


  1. ivar_getTypeEncoding
    在swift中,我用这个函数,就是得不到一个对象属性的类型。
首先定义了一个Person类作为测试/******************这是swift*********************/class Person: NSObject {    var name = "123"    var age = 18    var color = UIColor.white}var count: UInt32 = 0let ivars = class_copyIvarList(Person.self, &count)for i in 0..<Int(count) {    let ivar = ivars![i]    let name = String(utf8String: ivar_getName(ivar)!)    let type = String(utf8String: ivar_getTypeEncoding(ivar)!)    print(name, type)}//输出结果如下:swift中拿不到对象的属性的类型。Optional("name") Optional("")Optional("age") Optional("")Optional("color") Optional("")/******************这是objective-c*********************/@interface Person : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@property (nonatomic, strong) UIColor *color;@endunsigned int count = 0;Ivar *ivars = class_copyIvarList([Person class], &count);for (int i = 0; i < (int)count; i++) {   Ivar ivar = ivars[i];   const char *cName = ivar_getName(ivar);   const char *cType = ivar_getTypeEncoding(ivar);   NSString *name = [NSString stringWithUTF8String:cName];   NSString *type = [NSString stringWithUTF8String:cType];   NSLog(@"name = %@, type = %@", name, type);}//输出结果如下:oc中是都可以拿到属性的类型的。name = _age, type = iname = _name, type = @"NSString"name = _color, type = @"UIColor"

可以看出,在swift中已经拿不到一个对象属性的类型了。


  1. object_setIvar
    这个方法在swift中现在只有给类申明的变量设置值才有效,其他的都无效。
/******************这是swift*********************/class func modelWithDic(_ dic: [String: Any]) -> Any {    let obj = self.init()    for (key, value) in dic {        guard let ivar = class_getInstanceVariable(self, key) else {            continue        }        object_setIvar(obj, ivar, value)    }    return obj}let p = Person.modelWithDic(["name": "swift", "age": 25 ,"color": UIColor.blue]) as! Personprint(p.name, p.age, p.color)//打印结果如下:可以看出,用String、Int定义的变量,设置的值是无效的,他们在swift中类型都是结构体,而用类定义的变量,设置的值是有效的。\220r$ -5764607523034234477 UIExtendedSRGBColorSpace 0 0 1 1/******************这是objective-c*********************/+ (instancetype)modelWithDic:(NSDictionary *)dic {    id obj = [[self alloc] init];    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull value, BOOL * _Nonnull stop) {        NSString *ivarKey = [NSString stringWithFormat:@"_%@", key];        Ivar ivar = class_getInstanceVariable([self class], [ivarKey cStringUsingEncoding:NSUTF8StringEncoding]);        if (ivar != nil) {            object_setIvar(obj, ivar, value);        }    }];    return obj;}Person *p = [Person modelWithDic:@{@"name": @"oc", @"age": @10, @"color": [UIColor blueColor]}];NSLog(@"name = %@, age = %d, color = %@", p.name, p.age, p.color);//运行结果如下:可以看出,oc中是全部可以设置值的。name = oc, age = 162, color = UIExtendedSRGBColorSpace 0 0 1 1
原创粉丝点击