iOS -> Android (Objective-C -> Java)
公有常量定义
Objective-C
1 | // .h |
Java
1 | public static final String API_LOGIN = "account/login"; |
正则替换
1 | ^\s*NSString\s*\*\s*const\s*(\w+)\s*\=\s*\@\"([^\"]+)\";\s*$ |
私有常量定义
Objective-C
1 | // .m |
Java
1 | private static final String SYNC_UID = "uid"; |
正则替换
1 | ^\s*static\s*NSString\s*\*\s*const\s*(\w+)\s*\=\s*\@\"([^\"]+)\";\s*$ |
通知中心
Objective-C
1 | [[NSNotificationCenter defaultCenter] addObserver:self selector: (notifyDataSetChanged:) name:kAddFavorCompleted object:nil]; |
Java
Android 需要先支持对应语法的 NotificationCenter
1 | NotificationCenter.defaultCenter().addObserver(kAddFavorCompleted, notifyDataSetChanged); |
正则替换
1 | ^\s*\[\[NSNotificationCenter\ defaultCenter\]\s+addObserver:self\ selector:@selector\((\w*):\)\ name:(\w+)\ object:nil\];.*?$ |
回调函数
Objective-C
1 | // 定义 |
Java
1 | // 定义 |
字典
NSDictionary <-> Map
Objective-C
1 | NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; |
Java
1 | Map<String, Object> parameters = new HashMap<String, Object>(); |
Model - JSON
在 OC
中,NSDictionary
既可以表征字典对象,也可以表示 JSON
对象;而在 Java
中,Map
、JSONObject
分别表示字典对象和 JSON
对象,JSONObject
的使用经常需要加上 try...catch
,容错性不好,相当不美观。
根据数据直接初始化一个类,YYModel
主要实现 NSDictionary
与 Class
的相互转换;fastjson
则是实现 JSON
文本与 Class
的相互转换(本质上是 文本->JSONObject->Class),实际上容错性也并不好。
为了两端统一,于是在应用层尽可能地不用 JSONObject
,统一用 Map
,额外实现一个 JsonHelper
工具类,做到 Map
和 JSONObject
之间的相互转换。
映射表
1 | // YYModel |
1 | // fastjson |
白名单
YYModel
可以在modelPropertyWhitelist
中定义fastjson
默认处理满足JavaBeans
规范的成员 | JavaBeans规范及生成技巧
其他一些对应方案
类描述
- Objective-C:
description
- Java:
toString
抽象类
Objective-C
没有抽象类,可通过Protocol
配合Exception
做到工程上的控制
协议/接口
- Objective-C:
@protocol
,有optional
选项 - Java:
interface
,没有optional
选项
静态方法
Objective-C
中可以在静态方法中使用[self class]
轻松获取到调用类Java
的应对方案 1: 采用抛异常获取调用栈,进而拿到调用类,性能差,吃相难看,不推荐Java
的应对方案 2: 采用模板类,直接将调用类传入
1 | public static <T> T someFunc(Class<T> clazz) |
虽然传递 Class<T>
可以拿到调用类,但初始化依然是一个难题;在 Objective-C
中,通过 [[[self class] alloc] init]
即可轻松创建实例;Java
中则要延续难看的吃相。