swift 4.0時代的到來,說明了swift已經趨於穩定了,已經徹底能夠入坑了.git
下面就拿最簡單的數據轉模型來講說,實戰一下.github
接口使用: http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1 json
分別演示下: 1.SwiftyJSON 2.HandyJSON 3.ObjectMapper 4.swift4.0 Codableswift
說明:對上面幾種方案使用事後1.SwiftyJSON直接對返回數據進行操做,不包含模型轉換.我的不太喜歡api
2.HandyJSON阿里封裝的數據轉模型,朋友說這個輪子有點方app
3.ObjectMapper朋友推薦使用這個ide
4.swift4.0 Codable,我的也不太喜歡ui
1.SwiftyJSON spa
C層:3d
1 // 2 // TabOneVC.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/19. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // SwiftyJSON -- https://github.com/SwiftyJSON/SwiftyJSON 8 9 import UIKit 10 import Alamofire 11 import SwiftyJSON 12 private let oneCellIdentifier = "oneCellIdentifier" 13 14 class TabOneVC: UIViewController { 15 16 lazy var oneTableView:UITableView = { 17 let tabView = UITableView.init(frame: UIScreen.main.bounds) 18 tabView.delegate = self 19 tabView.dataSource = self 20 tabView.rowHeight = 220.0 21 tabView.register(OneCell.self, forCellReuseIdentifier: oneCellIdentifier) 22 view.addSubview(tabView) 23 return tabView 24 25 }() 26 27 var ary:[JSON]! = [] 28 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33 Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in 34 let data = response.result.value 35 let j = JSON.init(data!) 36 self.ary = j["lives"].array 37 self.oneTableView.reloadData() 38 } 39 } 40 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 // Dispose of any resources that can be recreated. 44 } 45 46 47 48 } 49 extension TabOneVC: UITableViewDelegate,UITableViewDataSource{ 50 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 51 return ary.count; 52 } 53 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 let cell = tableView.dequeueReusableCell(withIdentifier: oneCellIdentifier, for: indexPath) as! OneCell 56 cell.jsonObj = ary[indexPath.row] 57 58 return cell; 59 60 } 61 62 63 }
cell:
1 // 2 // OneCell.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/19. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import SwiftyJSON 11 import SDWebImage 12 class OneCell: UITableViewCell { 13 var jsonObj:JSON?{ 14 didSet{ 15 nameLabel.text = String(describing: jsonObj!["creator"]["nick"]) + "-" + String(describing: jsonObj!["city"]) 16 let str:String = String(describing: jsonObj!["creator"]["portrait"]) 17 picImgView.sd_setImage(with: URL.init(string: str), completed: nil) 18 } 19 } 20 21 lazy var nameLabel:UILabel = { 22 let la = UILabel.init() 23 return la; 24 }() 25 26 lazy var picImgView:UIImageView = { 27 let imgView = UIImageView.init() 28 return imgView; 29 }() 30 31 32 33 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 34 super.init(style: style, reuseIdentifier: reuseIdentifier) 35 setupUI() 36 addCons() 37 } 38 39 40 func setupUI(){ 41 contentView.addSubview(nameLabel) 42 contentView.addSubview(picImgView) 43 44 } 45 46 func addCons(){ 47 nameLabel.snp.makeConstraints { (make) in 48 make.leftMargin.equalTo(contentView.snp.left).offset(10) 49 make.rightMargin.equalTo(contentView.snp.right).offset(-10) 50 make.topMargin.equalTo(contentView.snp.top).offset(10) 51 make.height.equalTo(50) 52 } 53 picImgView.snp.makeConstraints { (make) in 54 make.leftMargin.equalTo(contentView.snp.left).offset(10) 55 make.topMargin.equalTo(nameLabel.snp.bottom).offset(20) 56 make.height.width.equalTo(120) 57 } 58 59 60 } 61 62 required init?(coder aDecoder: NSCoder) { 63 fatalError("init(coder:) has not been implemented") 64 } 65 66 }
2.HandyJSON
C層:
1 // 2 // TabTwoVC.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/19. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // HandyJSON -- https://github.com/alibaba/HandyJSON 8 9 import UIKit 10 import Alamofire 11 import HandyJSON 12 13 private let twoCellIdentifier = "twoCellIdentifier" 14 class TabTwoVC: UIViewController { 15 16 lazy var twoTableView:UITableView = { 17 let tabView = UITableView.init(frame: UIScreen.main.bounds) 18 tabView.delegate = self 19 tabView.dataSource = self 20 tabView.rowHeight = 220.0 21 tabView.register(TwoCell.self, forCellReuseIdentifier: twoCellIdentifier) 22 view.addSubview(tabView) 23 24 return tabView 25 }() 26 27 var ary:[Dictionary<String, Any>] = [] 28 29 override func viewDidLoad() { 30 super.viewDidLoad() 31 32 Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in 33 let data:Dictionary<String,Any> = response.result.value as! Dictionary 34 self.ary = data["lives"] as! [Dictionary<String, Any>] 35 self.twoTableView.reloadData() 36 } 37 38 } 39 40 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 // Dispose of any resources that can be recreated. 44 } 45 46 47 48 } 49 50 extension TabTwoVC: UITableViewDelegate,UITableViewDataSource{ 51 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 52 return ary.count; 53 } 54 55 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 56 let cell = tableView.dequeueReusableCell(withIdentifier: twoCellIdentifier, for: indexPath) as! TwoCell 57 cell.model = JSONDeserializer.deserializeFrom(dict: ary[indexPath.row]) 58 return cell; 59 60 } 61 62 63 }
cell:
1 // 2 // TwoCell.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/19. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import SnapKit 11 import SDWebImage 12 class TwoCell: UITableViewCell { 13 14 var model:TwoModel!{ 15 didSet{ 16 nameLabel.text = model.creator.nick + "-" + model.city 17 let str = model.creator.portrait 18 picImgView.sd_setImage(with: URL.init(string: str!), completed: nil) 19 20 } 21 } 22 23 lazy var nameLabel:UILabel = { 24 let la = UILabel.init() 25 return la; 26 }() 27 28 lazy var picImgView:UIImageView = { 29 let imgView = UIImageView.init() 30 return imgView; 31 }() 32 33 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 34 super.init(style: style, reuseIdentifier: reuseIdentifier) 35 setupUI() 36 addCons() 37 } 38 39 40 func setupUI(){ 41 contentView.addSubview(nameLabel) 42 contentView.addSubview(picImgView) 43 44 } 45 46 func addCons(){ 47 nameLabel.snp.makeConstraints { (make) in 48 make.leftMargin.equalTo(contentView.snp.left).offset(10) 49 make.rightMargin.equalTo(contentView.snp.right).offset(-10) 50 make.topMargin.equalTo(contentView.snp.top).offset(10) 51 make.height.equalTo(50) 52 } 53 picImgView.snp.makeConstraints { (make) in 54 make.rightMargin.equalTo(contentView.snp.right).offset(-10) 55 make.topMargin.equalTo(nameLabel.snp.bottom).offset(20) 56 make.height.width.equalTo(120) 57 } 58 59 60 } 61 62 required init?(coder aDecoder: NSCoder) { 63 fatalError("init(coder:) has not been implemented") 64 } 65 }
model:
1 // 2 // Model.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/19. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import HandyJSON 11 struct TwoModel: HandyJSON { 12 var city:String! 13 var creator:TwoCreatorModel! 14 } 15 16 struct TwoCreatorModel: HandyJSON { 17 var nick:String! 18 var portrait:String! 19 }
3.ObjectMapper
C層:
1 // 2 // TabThreeVC.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // ObjectMapper -- https://github.com/Hearst-DD/ObjectMapper 8 9 import UIKit 10 import Alamofire 11 import ObjectMapper 12 private let threeCellIdentifier = "threeCellIdentifier" 13 14 class TabThreeVC: UIViewController { 15 16 lazy var threeTableView:UITableView = { 17 let tabView = UITableView.init(frame: UIScreen.main.bounds) 18 tabView.delegate = self 19 tabView.dataSource = self 20 tabView.rowHeight = 220.0 21 tabView.register(ThreeCell.self, forCellReuseIdentifier: threeCellIdentifier) 22 return tabView 23 }() 24 var ary:[Dictionary<String, Any>] = [] 25 26 27 28 override func viewDidLoad() { 29 super.viewDidLoad() 30 view.addSubview(threeTableView) 31 Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseJSON { (response) in 32 let data:Dictionary<String,Any> = response.result.value as! Dictionary 33 self.ary = data["lives"] as! [Dictionary<String, Any>] 34 self.threeTableView.reloadData() 35 } 36 37 } 38 39 override func didReceiveMemoryWarning() { 40 super.didReceiveMemoryWarning() 41 // Dispose of any resources that can be recreated. 42 } 43 44 } 45 46 47 extension TabThreeVC: UITableViewDelegate,UITableViewDataSource{ 48 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 49 return ary.count; 50 } 51 52 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 53 let cell = tableView.dequeueReusableCell(withIdentifier: threeCellIdentifier, for: indexPath) as! ThreeCell 54 cell.model = Mapper<ThreeModel>().map(JSON: ary[indexPath.row]) 55 return cell; 56 57 } 58 59 60 61 62 }
cell:
1 // 2 // ThreeCell.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import SnapKit 11 import SDWebImage 12 13 class ThreeCell: UITableViewCell { 14 15 var model:ThreeModel!{ 16 didSet{ 17 nameLabel.text = model.creator!.nick! + model.city! 18 let str = model.creator!.portrait 19 picImgView.sd_setImage(with: URL.init(string: str!), completed: nil) 20 21 } 22 } 23 24 25 lazy var nameLabel:UILabel = { 26 let la = UILabel.init() 27 la.textAlignment = .center 28 return la; 29 }() 30 31 lazy var picImgView:UIImageView = { 32 let imgView = UIImageView.init() 33 return imgView; 34 }() 35 36 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 37 super.init(style: style, reuseIdentifier: reuseIdentifier) 38 setupUI() 39 addCons() 40 } 41 42 43 func setupUI(){ 44 contentView.addSubview(nameLabel) 45 contentView.addSubview(picImgView) 46 47 } 48 49 func addCons(){ 50 nameLabel.snp.makeConstraints { (make) in 51 make.leftMargin.equalTo(contentView.snp.left).offset(10) 52 make.rightMargin.equalTo(contentView.snp.right).offset(-10) 53 make.topMargin.equalTo(contentView.snp.top).offset(10) 54 make.height.equalTo(50) 55 } 56 picImgView.snp.makeConstraints { (make) in 57 make.center.equalTo(contentView.snp.center) 58 make.height.width.equalTo(120) 59 } 60 61 } 62 63 required init?(coder aDecoder: NSCoder) { 64 fatalError("init(coder:) has not been implemented") 65 } 66 67 }
model:
1 // 2 // ThreeModel.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import ObjectMapper 11 12 struct ThreeModel: Mappable { 13 var city:String! 14 var creator:ThreeCreatorModel! 15 16 mutating func mapping(map: Map) { 17 city <- map["city"] 18 creator <- map["creator"] 19 } 20 21 init?(map: Map) { 22 23 } 24 25 } 26 27 struct ThreeCreatorModel: Mappable { 28 var nick:String! 29 var portrait:String! 30 31 mutating func mapping(map: Map) { 32 nick <- map["nick"] 33 portrait <- map["portrait"] 34 } 35 36 init?(map: Map) { 37 38 } 39 40 }
4.swift4.0 Codable
C層:
1 // 2 // TabFourVC.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 自家孩子 swift4.0 Codable 8 9 import UIKit 10 import Alamofire 11 12 private let fourCellIdentifier = "fourCellIdentifier" 13 14 class TabFourVC: UIViewController { 15 16 lazy var fourTableView:UITableView = { 17 let tabView = UITableView.init(frame: UIScreen.main.bounds) 18 tabView.delegate = self 19 tabView.dataSource = self 20 tabView.rowHeight = 220.0 21 tabView.register(FourCell.self, forCellReuseIdentifier: fourCellIdentifier) 22 view.addSubview(tabView) 23 return tabView 24 }() 25 var model:FourModel! 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 Alamofire.request("http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1").responseData { (data) in 30 self.model = try! JSONDecoder().decode(FourModel.self, from: data.result.value!) 31 self.fourTableView.reloadData() 32 } 33 } 34 35 override func didReceiveMemoryWarning() { 36 super.didReceiveMemoryWarning() 37 // Dispose of any resources that can be recreated. 38 } 39 40 41 } 42 43 extension TabFourVC: UITableViewDelegate,UITableViewDataSource{ 44 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 return model.lives.count; 46 } 47 48 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 49 let cell = tableView.dequeueReusableCell(withIdentifier: fourCellIdentifier, for: indexPath) as! FourCell 50 cell.model = model.lives[indexPath.row] 51 return cell; 52 } 53 54 55 }
cell:
1 // 2 // FourCell.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 import SnapKit 11 import SDWebImage 12 13 class FourCell: UITableViewCell { 14 15 var model:FourLivesModel!{ 16 didSet{ 17 nameLabel.text = model.city + model.creator.nick 18 let str = model.creator.portrait 19 picImgView.sd_setImage(with: URL.init(string: str), completed: nil) 20 } 21 } 22 23 lazy var nameLabel:UILabel = { 24 let la = UILabel.init() 25 la.textAlignment = .center 26 la.backgroundColor = UIColor.red 27 return la; 28 }() 29 30 lazy var picImgView:UIImageView = { 31 let imgView = UIImageView.init() 32 return imgView; 33 }() 34 35 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 36 super.init(style: style, reuseIdentifier: reuseIdentifier) 37 setupUI() 38 addCons() 39 } 40 41 42 func setupUI(){ 43 contentView.addSubview(nameLabel) 44 contentView.addSubview(picImgView) 45 46 } 47 48 func addCons(){ 49 picImgView.snp.makeConstraints { (make) in 50 make.center.equalTo(contentView.snp.center) 51 make.height.width.equalTo(120) 52 } 53 nameLabel.snp.makeConstraints { (make) in 54 make.leftMargin.equalTo(contentView.snp.left).offset(10) 55 make.rightMargin.equalTo(contentView.snp.right).offset(-10) 56 make.topMargin.equalTo(picImgView.snp.bottom).offset(10) 57 make.height.equalTo(50) 58 } 59 60 } 61 62 required init?(coder aDecoder: NSCoder) { 63 fatalError("init(coder:) has not been implemented") 64 } 65 66 }
model:
1 // 2 // FourModel.swift 3 // myDemo 4 // 5 // Created by Shaoting Zhou on 2017/12/20. 6 // Copyright © 2017年 Shaoting Zhou. All rights reserved. 7 // 8 9 import UIKit 10 11 struct FourModel: Codable { 12 var error_msg:String 13 var lives:[FourLivesModel] 14 15 } 16 17 struct FourLivesModel: Codable { 18 var city:String 19 var creator:FourCreatorModel 20 } 21 22 struct FourCreatorModel: Codable { 23 var nick:String 24 var portrait:String 25 }
基本的效果都長這樣:
GitHub地址: https://github.com/pheromone/swift_study