一條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)確了。