swift中字串型資料對映為數值型資料的解決辦法
一條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 = "--"
這樣的其實表示的沒值的情況,返回的是 "--"
,那麼遇到"--"
這的情況下會走下面這句程式碼
轉換為數值型後,排序就準確了。
相關文章
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- FLOAT:浮點數值資料的大致數值資料型別資料型別
- js中其他資料型別的值轉為字串的相關總結JS資料型別字串
- XSD 數值資料型別資料型別
- springboot接收Date型別資料異常與解決辦法Spring Boot型別
- 『無為則無心』Python基礎 — 8、Python中的資料型別(數值、布林、字串)Python資料型別字串
- Redis - 資料型別對映底層結構Redis資料型別
- JS中其他資料型別轉為number資料型別的方法JS資料型別
- 基本資料型別與字串型別資料型別字串
- 區別值型別資料和引用型別資料型別
- 本地方法怎麼對映Java層的資料型別Java資料型別
- 資料傾斜解決辦法
- 資料型別之字串篇資料型別字串
- 基本資料型別之字串資料型別字串
- python 內建資料結構-數值型Python資料結構
- Entity Framework 對映的時候預設給資料庫表名新增複數“s”或者“es”的解決辦法Framework資料庫
- mysql中數值型資料有哪兩個類別?MySql
- 判斷值的資料型別資料型別
- mysql儲存資料,varchar型別中的資料變成了科學計數法?MySql型別
- 0-4 Python 基礎資料型別-數值型別Python資料型別
- 解決Mysql資料庫插入資料出現問號(?)的解決辦法MySql資料庫
- 為什麼資料庫表的int型別欄位對映到實體類中要使用Integer型別,而不是int型別?...資料庫型別
- swift基本資料型別使用-字典使用Swift資料型別
- Java中的基本資料型別與引用資料型別Java資料型別
- Python資料型別(數字,字串,[列表],(元組),{字典:字典值},{列表,列表2})Python資料型別字串
- Java 支援的資料型別與 MySQL 支援的資料型別對比Java資料型別MySql
- Oracle字串資料型別簡述Oracle字串資料型別
- Python - 基本資料型別_str 字串Python資料型別字串
- Kotlin 資料型別詳解:數字、字元、布林值與型別轉換指南Kotlin資料型別字元
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- JAVA中基本資料型別和引用資料型別Java資料型別
- MySQL 與 Elasticsearch 資料不對稱問題解決辦法MySqlElasticsearch
- 數字化轉型對企業的意義?以資料中臺為驅動,深入挖掘資料價值
- yii2 從資料庫獲取內容值型別與資料庫欄位型別問題解決資料庫型別
- 資料庫欄位為0000-00-00的解決辦法資料庫
- SQL SERVER 資料庫被標記為“可疑”的解決辦法SQLServer資料庫
- MySql資料庫 數值型別的顯示寬度MySql資料庫型別
- 最新 Swift5 常見資料型別Swift資料型別
- XML Schema 字串資料型別及約束詳解XML字串資料型別