Swift 字典转模型(KakaJSON) ---2.数据类型

由于JSON格式能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型。

  • 比如服务器返回的时间可能是个毫秒数1565480696,但客户端想要的是Date类型
  • 再比如客户端想要的是浮点数Double类型,但服务器返回的可能是字符串类型"6.45"
  • 再比如客户端想要的是Bool类型,但服务器返回的可能是"true"、"1"、0
  • 再比如客户端想要的是高精度浮点数NSDecimalNumber类型,服务器为了维持精度可能返回字符串"0.1234567890123456789"

1. Int

struct Student: Convertible {
    var age1: Int8 = 6
    var age2: Int16 = 0
    var age3: Int32 = 0
    var age4: Int64 = 0
    var age5: UInt8 = 0
    var age6: UInt16 = 0
    var age7: UInt32 = 0
    var age8: UInt64 = 0
    var age9: UInt = 0
    var age10: Int = 0
    var age11: Int = 0
}

let json: [String: Any] = [
    "age1": "suan8fa8",
    "age2": "6suan8fa8",
    "age3": "6",
    "age4": 6.66,
    "age5": NSNumber(value: 6.66),
    "age6": Int32(6),
    "age7": true,
    "age8": "FALSE",
    "age9": Decimal(6.66),
    "age10": NSDecimalNumber(value: 6.66),
    "age11": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("age1:\(student.age1)  age2:\(student.age2)  age3:\(student.age3)  age4:\(student.age4)  age5:\(student.age5)  age6:\(student.age6)  age7:\(student.age7)  age8:\(student.age8)  age9:\(student.age9)  age10:\(student.age10)  age11:\(student.age11)")
/*
age1:6  age2:6  age3:6  age4:6  age5:6  age6:6  age7:1  age8:0  age9:6  age10:6  age11:1565922866
*/

2. Float

struct Student: Convertible {
    var height1: Float = 0.0
    var height2: Float = 0.0
    var height3: Float = 0.0
    var height4: Float = 0.0
    var height5: Float = 0.0
    var height6: Float = 0.0
    var height7: Float = 0.0
    var height8: Float = 0.0
    var height9: Float = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.12345678",
    "height3": NSDecimalNumber(string: "0.12345678"),
    "height4": Decimal(string: "0.12345678") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": CGFloat(0.12345678),
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.12345678  height3:0.12345678  height4:0.12345678  height5:666.0  height6:1.0  height7:0.0  height8:0.12345678  height9:1.5659228e+09
*/

3. Double

struct Student: Convertible {
    var height1: Double = 0.0
    var height2: Double = 0.0
    var height3: Double = 0.0
    var height4: Double = 0.0
    var height5: Double = 0.0
    var height6: Double = 0.0
    var height7: Double = 0.0
    var height8: Double = 0.0
    var height9: Double = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.1234567890123456",
    "height3": NSDecimalNumber(string: "0.1234567890123456"),
    "height4": Decimal(string: "0.1234567890123456") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": CGFloat(0.1234567890123456),
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.1234567890123456  height3:0.1234567890123456  height4:0.1234567890123456  height5:666.0  height6:1.0  height7:0.0  height8:0.1234567890123456  height9:1565922866.0
*/

4. CGFloat

struct Student: Convertible {
    var height1: CGFloat = 0.0
    var height2: CGFloat = 0.0
    var height3: CGFloat = 0.0
    var height4: CGFloat = 0.0
    var height5: CGFloat = 0.0
    var height6: CGFloat = 0.0
    var height7: CGFloat = 0.0
    var height8: CGFloat = 0.0
    var height9: CGFloat = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.1234567890123456",
    "height3": NSDecimalNumber(string: "0.1234567890123456"),
    "height4": Decimal(string: "0.1234567890123456") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": 0.1234567890123456,
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.1234567890123456  height3:0.1234567890123456  height4:0.1234567890123456  height5:666.0  height6:1.0  height7:0.0  height8:0.1234567890123456  height9:1565922866.0
*/

5. Bool

struct Student: Convertible {
    var rich1: Bool = false
    var rich2: Bool = false
    var rich3: Bool = false
    var rich4: Bool = false
    var rich5: Bool = false
    var rich6: Bool = false
}

let json: [String: Any] = [
    "rich1": 100,
    "rich2": 0.0,
    "rich3": "1",
    "rich4": NSNumber(value: 0.666),
    "rich5": "true",
    "rich6": "NO"
]

// 数值0为false,数值非0都是true
let student = json.kj.model(Student.self)
print("rich1:\(student.rich1)  rich2:\(student.rich2)  rich3:\(student.rich3)  rich4:\(student.rich4)  rich5:\(student.rich5)  rich6:\(student.rich6)")
/*
rich1:true  rich2:false  rich3:true  rich4:true  rich5:true  rich6:false
*/

6. String

// 不管是String、NSString,还是NSMutableString,都是等效支持的
struct Student: Convertible {
    var name1: String = ""
    var name2: String = ""
    var name3: NSString = ""
    var name4: NSString = ""
    var name5: NSMutableString = ""
    var name6: NSMutableString = ""
    var name7: String = ""
    var name8: String = ""
    var name9: String = ""
}

let json: [String: Any] = [
    "name1": 666,
    "name2": NSMutableString(string: "777"),
    "name3": [1,[2,3],"4"],
    "name4": NSDecimalNumber(string: "0.123456789012345678901234567890123456789"),
    "name5": 6.66,
    "name6": false,
    "name7": NSURL(fileURLWithPath: "/users/mj/desktop"),
    "name8": URL(string: "http://www.520suanfa.com") as Any,
    "name9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("name1:\(student.name1)  name2:\(student.name2)  name3:\(student.name3)  name4:\(student.name4)  name5:\(student.name5)  name6:\(student.name6)  name7:\(student.name7)  name8:\(student.name8)  name9:\(student.name9)")
/*
name1:666  name2:777  name3:[1, [2, 3], "4"]  name4:0.123456789012345678901234567890123456789  name5:6.66  name6:false  name7:file:///users/mj/desktop  name8:http://www.520suanfa.com  name9:1565922866
*/

7. Decimal

struct Student: Convertible {
    var money1: Decimal = 0
    var money2: Decimal = 0
    var money3: Decimal = 0
    var money4: Decimal = 0
    var money5: Decimal = 0
    var money6: Decimal = 0
    var money7: Decimal = 0
    var money8: Decimal = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": NSDecimalNumber(string: "0.123456789012345678901234567890123456789"),
    "money4": "0.123456789012345678901234567890123456789",
    "money5": 666,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.123456789012345678901234567890123456789  money4:0.123456789012345678901234567890123456789  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

8. NSDecimalNumber

struct Student: Convertible {
    var money1: NSDecimalNumber = 0
    var money2: NSDecimalNumber = 0
    var money3: NSDecimalNumber = 0
    var money4: NSDecimalNumber = 0
    var money5: NSDecimalNumber = 0
    var money6: NSDecimalNumber = 0
    var money7: NSDecimalNumber = 0
    var money8: NSDecimalNumber = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": Decimal(string: "0.123456789012345678901234567890123456789") as Any,
    "money4": "0.123456789012345678901234567890123456789",
    "money5": 666.0,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.123456789012345678901234567890123456789  money4:0.123456789012345678901234567890123456789  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

9. NSNumber

struct Student: Convertible {
    var money1: NSNumber = 0
    var money2: NSNumber = 0
    var money3: NSNumber = 0
    var money4: NSNumber = 0
    var money5: NSNumber = 0
    var money6: NSNumber = 0
    var money7: NSNumber = 0
    var money8: NSNumber = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": Decimal(string: "0.1234567890123456") as Any,
    "money4": "0.1234567890123456",
    "money5": 666.0,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.1234567890123456  money4:0.1234567890123456  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

10. URL

// 支持URL和NSURL,默认会将String转为URL\NSURL

struct Student: Convertible {
    var url1: NSURL?
    var url2: NSURL?
    var url3: URL?
    var url4: URL?
}

let url = "http://520suanfa.com/红黑树"
let encodedUrl = "http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91"

let json: [String: Any] = [
    "url1": url,
    "url2": URL(string: encodedUrl) as Any,
    "url3": url,
    "url4": NSURL(string: encodedUrl) as Any
]

let student = json.kj.model(Student.self)
print("url1:\(student.url1!)  url2:\(student.url2!)  url3:\(student.url3!)  url4:\(student.url4!)")
/*
url1:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url2:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url3:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url4:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91
*/

11. Date

// 支持Date和NSDate,默认会将秒数转为Date\NSDate
struct Student: Convertible {
    var date1: NSDate?
    var date2: NSDate?
    var date3: Date?
    var date4: Date?
    var date5: Date?
    var date6: Date?
    var date7: Date?
}

let milliseconds: TimeInterval = 1565922866

let json: [String: Any] = [
    "date1": milliseconds,
    "date2": Date(timeIntervalSince1970: milliseconds),
    "date3": milliseconds,
    "date4": NSDate(timeIntervalSince1970: milliseconds),
    "date5": "\(milliseconds)",
    "date6": NSDecimalNumber(string: "\(milliseconds)"),
    "date7": Decimal(string: "\(milliseconds)") as Any
]

let student = json.kj.model(Student.self)
print("date1:\(student.date1!)  date2:\(student.date2!)  date3:\(student.date3!)  date4:\(student.date4!)  date5:\(student.date5!)  date6:\(student.date6!)  date7:\(student.date7!)")
/*
date1:2019-08-16 02:34:26 +0000  date2:2019-08-16 02:34:26 +0000  date3:2019-08-16 02:34:26 +0000  date4:2019-08-16 02:34:26 +0000  date5:2019-08-16 02:34:26 +0000  date6:2019-08-16 02:34:26 +0000  date7:2019-08-16 02:34:26 +0000
*/

12. Enum

// 遵守一下ConvertibleEnum协议即可支持带有RawValue的Enum类型

enum Grade: String, ConvertibleEnum {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}

struct Student: Convertible {
    var grade1: Grade = .perfect
    var grade2: Grade = .perfect
}

let json: [String: Any] = [
    "grade1": "C",
    "grade2": "D"
]

let student = json.kj.model(Student.self)
print("grade1:\(student.grade1.rawValue)  grade2:\(student.grade2)")
// grade1:C  grade2:bad

/**********************************************/

// 换个浮点数试试
enum Grade2: Double, ConvertibleEnum {
    case perfect = 8.88
    case great = 7.77
    case good = 6.66
    case bad = 5.55
}

struct Student2: Convertible {
    var grade1: Grade2 = .perfect
    var grade2: Grade2 = .perfect
    var grade3: Grade2 = .perfect
    var grade4: Grade2 = .perfect
}

let json: [String: Any] = [
    "grade1": "5.55kaka",
    "grade2": 6.66,
    "grade3": NSNumber(value: 7.77),
    "grade4": NSDecimalNumber(string: "8.88")
]

let student = json.kj.model(Student2.self)
print("grade1:\(student.grade1)  grade2:\(student.grade2)  grade3:\(student.grade3)  grade4:\(student.grade4)")
// grade1:bad  grade2:good  grade3:great  grade4:perfect

13. Array

// 支持Array、NSArray、NSMutableArray与Set、NSSet、NSMutableSet之间自动转换

struct Person: Convertible {
    var array1: [Int]?
    var array2: NSArray?
    var array3: NSMutableArray?
    var array4: [Int]?
    var array5: NSArray?
    var array6: NSMutableArray?
}

let array = [1, 2, 3]

let json: [String: Any] = [
    "array1": NSMutableArray(array: array),
    "array2": array,
    "array3": array,
    "array4": NSMutableSet(array: array),
    "array5": NSSet(array: array),
    "array6": Set(array),
]

let person = json.kj.model(Person.self)
print("array1:\(person.array1!)  array2:\(person.array2!)  array3:\(person.array3!)  array4:\(person.array4!)  array5:\(person.array5!)  array6:\(person.array6!)")
/*
array1:[1, 2, 3]  array2:(
    1,
    2,
    3
)  array3:(
    1,
    2,
    3
)  array4:[3, 1, 2]  array5:(
    3,
    1,
    2
)  array6:(
    3,
    1,
    2
)
*/

14. Dictionary

// 支持Dictionary、NSDictionary、NSMutableDictionary之间自动转换

struct Person: Convertible {
    var dict1: [String: Any]?
    var dict2: NSDictionary?
    var dict3: NSMutableDictionary?
}

let dict = ["no1": 100, "no2": 200]

let json: [String: Any] = [
    "dict1": NSMutableDictionary(dictionary: dict),
    "dict2": dict,
    "dict3": dict
]

let person = json.kj.model(Person.self)
print("dict1:\(person.dict1!)  dict2:\(person.dict2!)  dict3:\(person.dict3!)")
/*
dict1:["no1": 100, "no2": 200]  dict2:{
    no1 = 100;
    no2 = 200;
}  dict3:{
    no1 = 100;
    no2 = 200;
}
*/

Swift 字典转模型(KakaJSON) ---1.基本用法
Swift 字典转模型(KakaJSON) ---3.key处理
Swift 字典转模型(KakaJSON) ---4.动态模型
Swift KakaJSON 05.---模型转字典
Swift KakaJSON 06.---Coding/归档/解档

你可能感兴趣的:(Swift 字典转模型(KakaJSON) ---2.数据类型)