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 中则要延续难看的吃相。