swift中字符串型數(shù)據(jù)映射為數(shù)值型數(shù)據(jù)的解決辦法

一條json數(shù)據(jù),全部是字符串類型的,如

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

這一條json實(shí)際上包含數(shù)值型的字符串傳數(shù)據(jù)和以及真正的字符串,如果全在映射時(shí)全部轉(zhuǎn)換為數(shù)值型(Double ,Int之類的),那么會(huì)有crash的情況,因?yàn)橛行┎⒉皇菙?shù)值型,而是真正的字符串,而且在全部設(shè)置為數(shù)值型的時(shí)候,映射出來的值也不對(duì),全部為nil,因?yàn)閿?shù)據(jù)類型不對(duì),objectMapper映射的結(jié)構(gòu)與后臺(tái)返回的json數(shù)據(jù)結(jié)構(gòu)是一致的,后臺(tái)返回什么樣的數(shù)據(jù)類型,就只能用什么樣的數(shù)據(jù)類型字段解析,否則沒有結(jié)果。我用的是realmSwift 進(jìn)行存儲(chǔ),發(fā)現(xiàn)realmSwift對(duì)這種數(shù)值型字符串排序的支持并不好,存在排序不準(zhǔn)確的情況(而且是一定會(huì)發(fā)生的情況),映射框架我用的是 objectMapper,在處理這個(gè)問題上,在realm-cocoa的issue上請(qǐng)教了作者,最后找到了解決辦法
objectMapper提供了一種轉(zhuǎn)換機(jī)制,在映射的時(shí)候就可以進(jìn)行轉(zhuǎn)換,


class Model: Object, Mappable {
  dynamic var navi_radio = ""       
  dynamic var price = "" 
  dynamic var price_radio = ""   
//   這里必須是對(duì)應(yīng)的字符串類型,雖然知道它是數(shù)值型的,
//   如果強(qiáng)制轉(zhuǎn)換為 dynamic var price = 0.00 這樣的數(shù)據(jù),結(jié)果為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"] 
    }
}
// 這是基本的映射結(jié)構(gòu),如果僅僅是這樣,是解決不了問題的.

那么就需要用下面的方法來進(jìn)行轉(zhuǎn)換了。

class Model: Object, Mappable {
  dynamic var navi_radio = ""       
  dynamic var price = "" 
  dynamic var price_radio = ""   
//   這里必須是對(duì)應(yīng)的字符串類型,雖然知道它是數(shù)值型的,
//   如果強(qiáng)制轉(zhuǎn)換為 dynamic var price = 0.00 這樣的數(shù)據(jù),結(jié)果為nil
  required convenience init?(_ map: Map) {
             self.init() 
       } 
   
// 將String轉(zhuǎn)換為為Double型 - 進(jìn)行映射
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轉(zhuǎn)換為Int進(jìn)行映射
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
      })

// 映射結(jié)構(gòu)
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
在這里原路返回就行,根據(jù)你的喜好返回對(duì)應(yīng)的空值就OK了

映射時(shí)調(diào)用上面的轉(zhuǎn)換方法,哪個(gè)字段需要轉(zhuǎn)換,就用哪個(gè)字段調(diào)用對(duì)應(yīng)的方法
此外,這個(gè)方法可以寫多個(gè),
比如現(xiàn)在這上面可以寫Double型的轉(zhuǎn)換,同時(shí)還可以寫Int型的轉(zhuǎn)換,等等...
至于diff = "--"這樣的其實(shí)表示的沒值的情況,返回的是 "--",那么遇到"--"這的情況下會(huì)走下面這句代碼
轉(zhuǎn)換為數(shù)值型后,排序就準(zhǔn)確了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容