1. require
在使用Objective-C类之前需要调用 :
require('UIView')var view = UIView.alloc().init()
可以用逗号 分隔,一次性导入多个类:
require('UIView, UIColor')var view = UIView.alloc().init()var red = UIColor.redColor()
或者直接在使用时才调用 :
require('UIView').alloc().init()
2. 调用OC方法
调用类方法
var redColor = UIColor.redColor();
调用实例方法
var view = UIView.alloc().init();view.setNeedsLayout();
参数传递
跟在OC一样传递参数:
Property
获取/修改 Property 等于调用这个 Property 的 getter / setter 方法,获取时记得加 :
view.setBackgroundColor(redColor);var bgColor = view.backgroundColor();
方法名转换
多参数方法名使用 分隔:
var indexPath = require('NSIndexPath').indexPathForRow_inSection(0, 1);
若原 OC 方法名里包含下划线 ,在 JS 使用双下划线 代替:
// Obj-C: [JPObject _privateMethod];JPObject.__privateMethod()
3. 特殊类型
Struct
JSPatch原生支持 CGRect / CGPoint / CGSize / NSRange 这四个 struct 类型,用 JS 对象表示:
// Obj-CUIView *view=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];[view setCenter:CGPointMake(10,10)];[view sizeThatFits:CGSizeMake(100, 100)];CGFloat x=view.frame.origin.x;NSRange range=NSMakeRange(0, 1);
// JSvar view = UIView.alloc().initWithFrame({x:20, y:20, Width<span>:100, Height<span>:100})view.setCenter({x: 10, y: 10})view.sizeThatFits({Width<span>: 100, Height<span>:100})var x = view.frame().xvar range = {location: 0, length: 1}
其他 Struct 类型的支持请参照 添加 struct 类型支持
Selector
在JS使用字符串代表 Selector:
//Obj-C[self performSelector:@selector(viewWillAppear:) withObject:@(YES)];
//JSself.performSelector_withObject("viewWillAppear:", 1)
nil
JS 上的 和 都代表 OC 的 ,如果要表示 , 用 代替:
//Obj-C@implemention JPTestObject+ (BOOL)testNull(NSNull *null) { return [null isKindOfClass:[NSNull class]]}@end
//JSrequire('JPTestObject').testNull(nsnull) //return 1require('JPTestObject').testNull(null) //return 0
4. NSArray / NSString / NSDictionary
NSArray / NSString / NSDictionary 不会自动转成对应的JS类型,像普通 NSObject 一样使用它们:
//Obj-C@implementation JPObject+ (NSArray *)data{ return @[[NSMutableString stringWithString:@"JS"]]}+ (NSMutableDictionary *)dict{ return [[NSMutableDictionary alloc] init];}@end
// JSrequire('JPObject')var ocStr = JPObject.data().objectAtIndex(0)ocStr.appendString("Patch")var dict = JPObject.dict()dict.setObject_forKey(ocStr, 'name')console.log(dict.objectForKey('name')) //output: JSPatch
如果要把 NSArray / NSString / NSDictionary 转为对应的 JS 类型,使用 接口:
// JSvar data = require('JPObject').data().toJS()//data instanceof Array===truedata.push("Patch")var dict = JPObject.dict()dict.setObject_forKey(data.join(''), 'name')dict.toJS()console.log(dict['name']) //output: JSPatch
5. Block
当要把 JS 函数作为 block 参数给 OC时,需要先使用 接口包装:
// Obj-C@implementation JPObject+ (void)request:(void(^)(NSString *content, BOOL success))callback{ callback(@"I'm content", YES);}@end
从 OC 返回给 JS 的 block,直接调用即可:
// Obj-C@implementation JPObjecttypedef void (^JSBlock)(NSDictionary *dict);+ (JSBlock)genBlock{ NSString *ctn=@"JSPatch"; JSBlock block=^(NSDictionary *dict) { NSLog(@"I'm %@, version: %@", ctn, dict[@"v"]) }; return block;}@end
// JSvar blk = require('JPObject').genBlock();blk({v: "0.0.1"}); //output: I'm JSPatch, version: 0.0.1
在 block 里无法使用 变量,需要在进入 block 之前使用临时变量保存它:
defineClass("JPViewController", { viewDidLoad: function() { var slf = self; require("JPTestObject").callBlock(block(function(){ //`self` is not available here, use `slf` instead. slf.doSomething(); }); }}
从 JS 传 block 到 OC,有两个限制:
A. block 参数个数最多支持4个。(若需要支持更多,可以修改源码)
B. block 参数