美文网首页
swift中字符串型数据映射为数值型数据的解决办法

swift中字符串型数据映射为数值型数据的解决办法

作者: 花前月下 | 来源:发表于2016-10-12 11:31 被阅读98次

一条json数据,全部是字符串类型的,如

{
      navi_radio = "2.10"
      price = "10"
      price_radio = "-0.28"
      ...
      diff = "--"  
}

这一条json实际上包含数值型的字符串传数据和以及真正的字符串,如果全在映射时全部转换为数值型(Double ,Int之类的),那么会有crash的情况,因为有些并不是数值型,而是真正的字符串,而且在全部设置为数值型的时候,映射出来的值也不对,全部为nil,因为数据类型不对,objectMapper映射的结构与后台返回的json数据结构是一致的,后台返回什么样的数据类型,就只能用什么样的数据类型字段解析,否则没有结果。我用的是realmSwift 进行存储,发现realmSwift对这种数值型字符串排序的支持并不好,存在排序不准确的情况(而且是一定会发生的情况),映射框架我用的是 objectMapper,在处理这个问题上,在realm-cocoa的issue上请教了作者,最后找到了解决办法
objectMapper提供了一种转换机制,在映射的时候就可以进行转换,


class Model: Object, Mappable {
  dynamic var navi_radio = ""       
  dynamic var price = "" 
  dynamic var price_radio = ""   
//   这里必须是对应的字符串类型,虽然知道它是数值型的,
//   如果强制转换为 dynamic var price = 0.00 这样的数据,结果为nil
  required convenience init?(_ map: Map) {
             self.init() 
       } 
   
func mapping(map: Map) { 
          navi_radio <- map["navi_radio"] 
          price <- map["price"] 
          price_radio <- map["price_radio"] 
          ...
          diff <- map["diff"] 
    }
}
// 这是基本的映射结构,如果仅仅是这样,是解决不了问题的.

那么就需要用下面的方法来进行转换了。

class Model: Object, Mappable {
  dynamic var navi_radio = ""       
  dynamic var price = "" 
  dynamic var price_radio = ""   
//   这里必须是对应的字符串类型,虽然知道它是数值型的,
//   如果强制转换为 dynamic var price = 0.00 这样的数据,结果为nil
  required convenience init?(_ map: Map) {
             self.init() 
       } 
   
// 将String转换为为Double型 - 进行映射
let transformDouble = TransformOf<Double, String>(fromJSON: { (value: String?) -> Double? in 
          // transform value from String? to Double? 
          return Double(value!)
}, toJSON: { (value: Double?) -> String? in 
          // transform value from Double? to String?
         if let value = value { 
                return String(value) 
          }
           return nil
      })

// 将String转换为Int进行映射
let transformInt = TransformOf<Int, String>(fromJSON: { (value: String?) -> Int? in 
          // transform value from String? to Int? 
          return Int(value!)
}, toJSON: { (value: Int?) -> String? in 
          // transform value from Int? to String?
         if let value = value { 
                return String(value) 
          }
           return nil
      })

// 映射结构
func mapping(map: Map) { 
          navi_radio <-(map["navi_radio"],transformDouble) 
          price <- (map["price"] ,transformInt)
          price_radio <- (map["price_radio"] ,transformDouble)
          ...
          diff <- map["diff"] 
    }
}

if let value = value { 
                return String(value) 
         }
           return nil
在这里原路返回就行,根据你的喜好返回对应的空值就OK了

映射时调用上面的转换方法,哪个字段需要转换,就用哪个字段调用对应的方法
此外,这个方法可以写多个,
比如现在这上面可以写Double型的转换,同时还可以写Int型的转换,等等...
至于diff = "--"这样的其实表示的没值的情况,返回的是 "--",那么遇到"--"这的情况下会走下面这句代码
转换为数值型后,排序就准确了。

相关文章

  • swift中字符串型数据映射为数值型数据的解决办法

    一条json数据,全部是字符串类型的,如 这一条json实际上包含数值型的字符串传数据和以及真正的字符串,如果全在...

  • 数据类型

    SQL中将数据类型分为三大类: 数值类型 字符串型 日期时间型 一、数值型 数值型数据:都是数值系统将数值型分为整...

  • 创建数据集

    1. 数据类型 数值型、字符串、逻辑型 ★逻辑型数据 ①比较运算的结果 >,<,<=,>=,==(判断是否相等),...

  • 数据可视化框架(转)

    类别比较型图表的数据一般包含数值型和类别型两种数据类型,比如在柱形图中,X轴为类别型数据,Y轴为数值型数据,采用位...

  • R语言数据结构2021.1.19

    数据类型 R语言数据类型包括数值型,字符串型,逻辑型和日期型,但不像C语言那样数值型还包括整型,单精度,浮点等,R...

  • Mysql数据类型

    sql 将数据类型分为三大类:数值类型,字符串,日期时间型 一、数值型: 数值大类:整数型和小数型 整数型 整数型...

  • Ruby ——Fizz Buzz (1)

    数据类型 Number 数值型整型( Fixnum ), 浮点型(Float ) String 字符串型类* St...

  • SQL列类型(数据类型)

    SQL中将数据类型分为三大类:数值型,日期时间型,字符串型

  • 原始类型和引用类型

    一、JavaScript有六种数据类型: *数值型 *字符串型 *布尔型 * Null * Undefined *...

  • 2. Dart - 基本数据类型

    本文主要介绍Dart 中的几种基本数据类型:数值型-Number、布尔型-boolean、字符串-String、列...

网友评论

      本文标题:swift中字符串型数据映射为数值型数据的解决办法

      本文链接:https://www.haomeiwen.com/subject/eersjttx.html