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 = "--"
這樣的其實表示的沒值的情況,返回的是 "--"
,那麼遇到"--"
這的情況下會走下面這句程式碼
轉換為數值型後,排序就準確了。
相關文章
- Swift-02.字串和資料型別Swift字串資料型別
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- FLOAT:浮點數值資料的大致數值資料型別資料型別
- js中其他資料型別的值轉為字串的相關總結JS資料型別字串
- MYSQL 資料型別儲存-數值型MySQL 資料型別
- iOS: addObjectsFromArray 新增資料一值為空的解決辦法iOSObject
- XSD 數值資料型別資料型別
- 【MySQL資料型別1之--數值型別】MySql資料型別
- Swift 資料型別(二)Swift資料型別
- Redis - 資料型別對映底層結構Redis資料型別
- JS中其他資料型別轉為number資料型別的方法JS資料型別
- MATLAB(2)資料型別一(數值型和…Matlab資料型別
- 預測數值型資料:迴歸
- springboot接收Date型別資料異常與解決辦法Spring Boot型別
- 『無為則無心』Python基礎 — 8、Python中的資料型別(數值、布林、字串)Python資料型別字串
- Swift學習——A Swift Tour 資料型別Swift資料型別
- 區別值型別資料和引用型別資料型別
- 基本資料型別與字串型別資料型別字串
- JNI/NDK開發指南(3):JNI資料型別及與Java資料型別的對映關係資料型別Java
- mysql中數值型資料有哪兩個類別?MySql
- 本地方法怎麼對映Java層的資料型別Java資料型別
- SqlServer與.NET的資料型別對映關係圖(轉)SQLServer資料型別
- 資料傾斜解決辦法
- 資料庫漏洞解決辦法資料庫
- 資料型別之字串篇資料型別字串
- 基本資料型別之字串資料型別字串
- 如何使用Java泛型對映不同的值型別Java泛型型別
- mysql儲存資料,varchar型別中的資料變成了科學計數法?MySql型別
- oracle將表中date資料型別修改為timestamp資料型別Oracle資料型別
- 判斷值的資料型別資料型別
- Entity Framework 對映的時候預設給資料庫表名新增複數“s”或者“es”的解決辦法Framework資料庫
- 為什麼資料庫表的int型別欄位對映到實體類中要使用Integer型別,而不是int型別?...資料庫型別
- Java中的基本資料型別與引用資料型別Java資料型別
- 解決Mysql資料庫插入資料出現問號(?)的解決辦法MySql資料庫
- python 內建資料結構-數值型Python資料結構
- oracle資料值型資料改精度測試Oracle
- 0-4 Python 基礎資料型別-數值型別Python資料型別