[教程] 手动将微信开放平台的 iOS SDK 转换到 Delphi 接口

1、下载 SDK,得到相应的头文件和静态链接库 .a;

2、打开 *.h ,然后挨个翻译,翻译的规则:

  • enum 是枚举类型,直接翻译成 delphi 对应的枚举类型就可以了
  • NSENUM 直接翻译成对应的常量定义
  • @interface 声明的是一个接口,在 Delphi 中需要做简单的对应
    • 2.1、声明一个对应的类的类型,如果 interface 继承自 NSObject,那么这个类型继承自 NSObjectClass。按 Delphi 的习惯,假设 @interface 的原始名为 A,则声明的类型为 AClass,继承自 NSObjectClass。然后按下 Ctrl+Shift+G 生成一个唯一的GUID,这个值是给 Delphi 自己玩的,所以与原始的 interface 无关,自己生成就好。
    • 2.2、声明一个对应的接口类型,这个类型名和 @interface 声明的类型名一致,也继承自同样的对象,如NSObject。同上生成一个唯一的接口 GUID。
    • 2.3、将 @interface  end 之前的成员,+ 后面跟的函数,放到 2.1 中定义类的类型接口中,- 后面跟的函数,放到 2.2 中定义的接口类型中,@property 后面的成员,放到 2.2 定义的接口中。
    • 2.4、@property 的成员放的时候,请按下面的规则处理:
      (1)、如果没有特别说明,则对应两个函数,一个函数和属性的名称一致,另一个函数为 set+首字母大写的属性名称。
      (2)、如果指定了 getter 和 setter ,则 getter 对应的是属性读函数的名称, setter 对应的是属性写函数的名称。
      (3)、如果指定的 readonly,则只有读函数,没有写函数。
    • 2.5、接口中的所有函数的调用规则全部为 cdecl。
    • 2.6、在每个接口实现完成后,加入 T+接口类型名=class(TOCGenericImport<2.1中的类的类型名,2.2中的接口类型名>) end; 这一行定义,这样就可以让 Delphi 自动导入对应的类型接口。
    • 2.7、如果 .h 文件中,变量或函数名使用了 Delphi 保留的关键字,则在前面加上 “&” 符号,如 type 转换为 &type 即可。
    • 2.8、@protocol 的东西是继承自 IObjectiveC 的接口,它没有 2.2 类似的部分。
    • 2.9、函数声明中带有 XXX: 参数1类型 参数1 YYY: 参数2类型 参数2 这样子的,需要用[MethodName(‘XXX:YYY:’)] 这样处理
  • 注意要引入相关的单元,最基本的单元需要引入:System.Classes, iOSapi.Foundation, Macapi.ObjectiveC。实际微信接口还需要引入  iOSapi.UIKit 单元,具体翻译就根据需要引入。

如我们翻译一段简单的 Object C 接口:

/*! @brief 该类为微信终端SDK所有请求类的基类
 *
 */
@interface BaseReq : NSObject

/** 请求类型 */
@property (nonatomic, assign) int type;
/** 由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录*/
@property (nonatomic, retain) NSString* openID;

@end

Delphi 翻译后结果:

  BaseReqClass = interface(NSObjectClass)
    ['{06A21E95-7159-4F90-B535-9ED96E1DF375}']
  end;

  BaseReq = interface(NSObject)
    ['{C36129E7-ABB1-47AA-A3B9-D70865DBAE24}']
    { 请求类型 }
    function &type: Integer; cdecl;
    procedure setType(value: Integer); cdecl;
    { 由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录 }
    function openID: NSString; cdecl;
    procedure setOpenID(value: NSString); cdecl;
  end;

  TBaseReq = class(TOCGenericImport<BaseReqClass, BaseReq>)
  end;

然后实际使用时,按照  Delphi 的规则创建 TBaseReq 相关成员方法及属性就好了。

 

分享到: