公有常量定义

Objective-C

1
2
3
4
5
6
7
8
9
10
// .h
extern NSString * const API_LOGIN;
extern NSString * const API_REGISTER;

// .m
NSString * const API_LOGIN = @"account/login";
NSString * const API_REGISTER = @"account/register";

@implementation
...

Java

1
2
public static final String API_LOGIN = "account/login";
public static final String API_REGISTER = "account/register";

正则替换

1
2
^\s*NSString\s*\*\s*const\s*(\w+)\s*\=\s*\@\"([^\"]+)\";\s*$
public static final String \1 = "\2";

私有常量定义

Objective-C

1
2
3
4
5
6
// .m

@implementation

static NSString * const SYNC_UID = @"uid";
...

Java

1
private static final String SYNC_UID = "uid";

正则替换

1
2
^\s*static\s*NSString\s*\*\s*const\s*(\w+)\s*\=\s*\@\"([^\"]+)\";\s*$
private static final String \1 = "\2";

通知中心

Objective-C

1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifyDataSetChanged:) name:kAddFavorCompleted object:nil];

Java

Android 需要先支持对应语法的 NotificationCenter

1
NotificationCenter.defaultCenter().addObserver(kAddFavorCompleted, notifyDataSetChanged);

正则替换

1
2
^\s*\[\[NSNotificationCenter\ defaultCenter\]\s+addObserver:self\ selector:@selector\((\w*):\)\ name:(\w+)\ object:nil\];.*?$
NotificationCenter.defaultCenter().addObserver(\2, \1);

回调函数

Objective-C

1
2
3
4
5
6
7
// 定义
typedef void (^SingleObjectBlock)(id obj);

// 调用
- (void)someFunc:(SingleObjectBlock)block {
block(SOME_OBJ);
}

Java

1
2
3
4
5
6
7
8
9
// 定义
public interface SingleObjectBlock {
public void run(Object obj);
}

// 调用
void startRequest(SingleObjectBlock block) {
block.run(SOME_OBJ);
}

字典

NSDictionary <-> Map

关于字典类型的一些实用点

Objective-C

1
2
3
4
5
6
7
8
9
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"account"] = account;
parameters[@"token"] = token;

// 合并
[parameters addEntriesFromDictionary:otherParams];

// 遍历
for (NSString *key in [parameters allKeys]) {}

Java

1
2
3
4
5
6
7
8
9
10
11
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("account", account);
parameters.put("token", token);

// 合并
parameters.putAll(otherParams);

// 遍历
for(String key : handlerMap.keySet()) {}

for(Map.Entry<String, Object> entry : parameters.entrySet()) {}

Model - JSON

OC 中,NSDictionary 既可以表征字典对象,也可以表示 JSON 对象;而在 Java 中,MapJSONObject 分别表示字典对象和 JSON 对象,JSONObject 的使用经常需要加上 try...catch,容错性不好,相当不美观。

根据数据直接初始化一个类,YYModel 主要实现 NSDictionaryClass 的相互转换;fastjson 则是实现 JSON 文本与 Class 的相互转换(本质上是 文本->JSONObject->Class),实际上容错性也并不好。

为了两端统一,于是在应用层尽可能地不用 JSONObject,统一用 Map,额外实现一个 JsonHelper 工具类,做到 MapJSONObject 之间的相互转换。

映射表

1
2
3
4
5
6
7
// YYModel
+ (NSDictionary *)modelCustomPropertyMapper
{
return @{@"uid" : @"uid",
@"feedType" : @"feed_type",
@"isDeleted" : @"is_deleted"};
}
1
2
3
4
5
6
7
8
9
// fastjson
@JSONField(name="uid")
public String uid;

@JSONField(name="feed_type")
public int feedType;

@JSONField(name="is_deleted")
public int isDeleted;

白名单


其他一些对应方案

类描述

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


未完待续