添加 struct 类型支持

JSPatch 默认支持的 struct 类型只有 CGRect / CGPoint / CGSize / NSRange,若要让 JS 脚本支持其他 struct 类型,需要先手动注册。例如要支持 CGAffineTransform,需要在使用前在 JS 使用 defineStruct() 接口定义:

require('JPEngine').defineStruct({
  "name": "CGAffineTransform",
  "types": "FFFFFF",
  "keys": ["a", "b", "c", "d", "tx", "ty"]
})

API

JPEngine  的  +defineStruct:  接口,可以让 JS 支持新的 struct 类型:

@interface JPEngine : NSObject
/*
@param defineDict = @{
  @"name": @"",   //struct 名
  @"types": @"",  //struct 各字段类型
  @"keys": @[@"", ...]  //struct 各字段名
}
*/
+ (void)defineStruct:(NSDictionary *)defineDict;
...
@end

types

types 字段表示 struct 各字段的类型,每种类型都由一个字母代替,字母含义如下:

'c': char 
'C': unsigned char 
's': short 
'S': unsigned short 
'i': int 
'I': unsigned int 
'l': long 
'L': unsigned long 
'q': long long 
'Q': unsigned long long 
'f': float 
'F': CGFloat 
'N': NSInteger 
'U': NSUInteger 
'd': double 
'B': BOOL 
这里 struct 有多少个字段,types 就有多少个字母,types 的字母顺序必须按 struct 定义的顺序写,举例:

struct JPDemoStruct {
  CGFloat a;
  long b;
  double c;
  BOOL d;
}
JPDemoStruct  对应的 type 就是  @"FldB"

keys

keys 数组表示 struct 各个字段在 JS 中使用的名字,其顺序必须与 struct 字段顺序一致,拿上述  JPDemoStruct  举例,它对应的 keys 数组应该是: @[@"a", @"b", @"c", @"d"] .

完整例子

OC 里有 JPDemoStruct 这个 struct 类型:

struct JPDemoStruct {
  CGFloat a;
  long b;
  double c;
  BOOL d;
}

想在 JS 上使用,需要事先调用定义:

[JPEngine defineStruct:@{
  @"name": @"JPDemoStruct",
  @"types": @"FldB",
  @"keys": @[@"a", @"b", @"c", @"d"]
}]

接着就可以在 JS 里使用了:

//OC
@implementation JPObject
+ (void)passStruct:(JPDemoStruct)s;
+ (JPDemoStruct)returnStruct;
@end
//JS
require('JPObject').passStruct({a:1, b:2, c:4.2, d:1})
var s = require('JPObject').returnStruct();

动态定义

我们也可以在 JS 里动态定义 struct 类型:

require('JPEngine').defineStruct({
  "name": "JPDemoStruct",
  "types": "FldB",
  "keys": ["a", "b", "c", "d"]
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于MapStruct类型转换,您可以按照以下步骤进行操作: 1. 首先,在您的项目中添加MapStruct依赖。您可以在Maven或Gradle构建工具中添加相应的依赖项。 2. 创建源类型(source type)和目标类型(target type),这些类型可以是POJO(普通Java对象)。 3. 在源类型和目标类型之间创建一个Mapper接口。该接口应该使用`@Mapper`注解进行标记,并且可以定义多个转换方法。 4. 在转换方法中,使用`@Mapping`注解指定源类型和目标类型之间的映射关系。您可以使用属性名称、表达式或自定义转换器来定义映射规则。 5. 在您的代码中使用`Mapper`接口生成的实现类,通过调用转换方法进行类型转换。 下面是一个简单的示例: ```java // 源类型 public class Source { private String name; private int age; // getter和setter方法省略 } // 目标类型 public class Target { private String fullName; private int yearsOld; // getter和setter方法省略 } // Mapper接口 @Mapper public interface SourceTargetMapper { @Mapping(source = "name", target = "fullName") @Mapping(source = "age", target = "yearsOld") Target sourceToTarget(Source source); } // 使用转换器 public class Main { public static void main(String[] args) { Source source = new Source(); source.setName("John"); source.setAge(25); SourceTargetMapper mapper = Mappers.getMapper(SourceTargetMapper.class); Target target = mapper.sourceToTarget(source); System.out.println(target.getFullName()); // 输出: John System.out.println(target.getYearsOld()); // 输出: 25 } } ``` 通过以上步骤,您可以使用MapStruct进行源类型和目标类型之间的转换。请注意,MapStruct支持更复杂的转换场景,例如集合映射和嵌套映射。您可以在MapStruct的官方文档中了解更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值