J2ObjC:如何翻译自己的类型

J2ObjC: How to translate own type

我想为特定于平台的代码创建 class-adapter。 比如有2个classes:

Java:

class SQLiteAdapter {
    public void executeSql() {
        //use android.database.sqlite
    }
}

Objective C

@interface SQLiteAdapter : NSObject {}
- (void)executeSql;
@end

如何"teach" J2ObjC 转换java 代码

SQLiteAdapter adapter = new SQLiteAdapter();
adapter.executeSql();

SQLiteAdapter* adapter =  [SQLiteAdapter alloc];
[adapter executeSql]

您可以使用 sqlighter,一个与 j2objc 兼容的库,它允许您为 Android 和 iOS 编写一次数据库访问代码。由于它包装了两个平台上的 SQLite 库,因此很容易切换。

如果您真的想实现自己的跨平台 API,通常应用会使用定义 API 的接口或抽象 class,并为每个平台单独实现使用 Dagger 或 Java 反射等依赖注入框架加载。

以您的代码为起点,首先将 SQLiteAdapter 定义为抽象 class,使用抽象的 executeSql() 方法:

public abstract class SQLiteAdapter {
  public abstract void executeSql();
}

接下来,定义一个 AndroidSQLiteAdapter,它扩展 SQLiteAdapter 并使用您的 Android 特定代码实现 executeSql():

class AndroidSQLiteAdapter extends SQLiteAdapter {
  public void executeSql() {
    //use android.database.sqlite
  }
}

最后用j2objc翻译SQLiteAdapter.java,修改你的iOS class:

#import "SQLiteAdapter.h"
#import <sqlite3.h>

@interface IosSQLiteAdapter : SQLiteAdapter
@end

@implementation IosSQLiteAdapter
- (void)executeSql {
  // Implement using SQLite C API.
}
@end