Swift和Objective-C的runtime的差异
来源:互联网 发布:淘宝用户服务协议 编辑:程序博客网 时间:2024/06/07 12:07
最近写swift的时候,用到了一些运行时的东西,但是有部分与oc还是有差异的,得不到想要的东西,于是记录一下目前自己遇到的两者之间的差别。
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中已经拿不到一个对象属性的类型了。
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
阅读全文
1 0
- Swift和Objective-C的runtime的差异
- swift学习中与Objective-C的差异
- swift学习中与Objective-C的差异
- Objective-C的Runtime
- Objective-C 的 Runtime
- Objective C的runtime
- Swift & the Objective-C Runtime
- Swift和Objective-C的混合编程
- Swift和Objective-C的联系
- Swift 和 Objective-C 混编的 Framework
- Swift和Objective-C的相互调用
- Objective-C的runtime详解
- Objective-C的Runtime特性
- Objective-C Runtime的数据类型
- Objective-C的runtime原理
- Hadoop和swift 的差异
- Swift之 ? 和 !的差异
- Objective-C的对象模型和runtime机制
- Android XML文件添加空格
- Scroll 单个目标居中显示
- Java接口的名称冲突问题
- 基于HTML5 Canvas的3D动态Chart图表
- python json模块
- Swift和Objective-C的runtime的差异
- Nginx流量控制
- ns2丢包原因
- layui表单提交时出现一闪而过的验证信息的原因
- 实验八--排序算法
- 利用pybombs安装最新源码软件,包括gnuradio, uhd, hackrf, limesuite, gqrx, 以及各种gnuradio模块.
- maven工程的mapper文件不发布发到target目录下的问题
- 这样找回回收站误删文件,非常靠谱!
- 《Java专栏》— JVM 内存机制