{
QRgb* line = (QRgb*) image.scanLine(j)
const uchar * r = channel_R.constScanLine(j)
const uchar * g = channel_G.constScanLine(j)
const uchar * b = channel_B.constScanLine(j)
for(int i = 0i <widthi++)
{
line[i] = qRgb(r[i], g[i], b[i])
}
在OC下面字典和模型的转换有些非常好用的第三方框架,如(YYMode, MJExtension等),当然Swift也可以借鉴这两个框架,只是需要创建模型的时候继承自NSObject,并且加上关键字@objcMembers既可。
1、在用原生Codable协议的时候,需要当前类继承协议Codable,只是swift的枚举、结构体和类都可以继承该协议。这点事OC无法做到的。
2、在使用Codable协议的时候,一定要确保模型和原始json数据之间的key值的一致性。
列入有一段json字典如下(这里我用的字典)
那么你的模型就需要如下实现(当然这是理想状态)
3、如果你的模型里面有一个字段如(name_op)并且原始json数据里面没有该值,此时你的模型如果如下。
那么你解析成模型的时候会失败,此时需要把不确定的值定义为可选类型。那么不管原始json数据有没有这个字段,都可以解析成功,如果没有,那么该属性为nil。
4、如果你的模型已经设计好了,但是原始json数据里面有个字段和你的字段事冲突的(如你的属性叫 nick 而原始数据为 nick_name ),那么该值是解析不成功的,如果是可选还好,至少能成功,否则就失败。
解决的办法是实现 enum CodingKeys: String, CodingKey {}这个映射关系
5、如果你的模型里面带有嵌套关系,比如你的模型里面有个其他模型或者模型数组,那么只要保证嵌套的模型里面依然实现了对应的协议,和当前模型一样即可。
6、如果模型里面和原始数据里面的类型不统一,那么这个解析也会以失败告终。而这种情况需要自定义一个类去适配当前属性。最常见的有(Bool和Int,Int和String)这些在后台若类型语言上是不加区分的。所以不确定到底是什么类型,如果随意定义一个那么会失败。
如下:定义了一个可能是Bool或者Int的类型
下面是一个Int 或者String类型的
在设计模型的时候,如下赋值
若是完成上面几步,基本可以解决字典模型转换的巨大部分问题。贴上我设计的模型。
以及创建的字典
使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)