how to use codable and decodable for the following json?











up vote
-2
down vote

favorite












I have a following sample json file I want to do it with modal classes but am not sure how to do this in code.



{
"countryCodes": [{
"country_code": "AF",
"country_name": "Afghanistan",
"dialling_code": "+93"
},
{
"country_code": "AL",
"country_name": "Albania",
"dialling_code": "+355"
},
{
"country_code": "DZ",
"country_name": "Algeria",
"dialling_code": "+213"
},
{
"country_code": "AS",
"country_name": "American Samoa",
"dialling_code": "+1"
}
]
}


My modal class is as follows



import Foundation
class CountryModal : NSObject, NSCoding{

var countryCodes : [CountryCode]!


/**
* Instantiate the instance using the passed dictionary values to set the properties values
*/
init(fromDictionary dictionary: [String:Any]){
countryCodes = [CountryCode]()
if let countryCodesArray = dictionary["countryCodes"] as? [[String:Any]]{
for dic in countryCodesArray{
let value = CountryCode(fromDictionary: dic)
countryCodes.append(value)
}
}
}

/**
* Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
*/
func toDictionary() -> [String:Any]
{
var dictionary = [String:Any]()
if countryCodes != nil{
var dictionaryElements = [[String:Any]]()
for countryCodesElement in countryCodes {
dictionaryElements.append(countryCodesElement.toDictionary())
}
dictionary["countryCodes"] = dictionaryElements
}
return dictionary
}

/**
* NSCoding required initializer.
* Fills the data from the passed decoder
*/
@objc required init(coder aDecoder: NSCoder)
{
countryCodes = aDecoder.decodeObject(forKey: "countryCodes") as? [CountryCode]
}

/**
* NSCoding required method.
* Encodes mode properties into the decoder
*/
@objc func encode(with aCoder: NSCoder)
{
if countryCodes != nil{
aCoder.encode(countryCodes, forKey: "countryCodes")
}
}
}


and



import Foundation
class CountryCode : NSObject, NSCoding{

var countryCode : String!
var countryName : String!
var diallingCode : String!


/**
* Instantiate the instance using the passed dictionary values to set the properties values
*/
init(fromDictionary dictionary: [String:Any]){
countryCode = dictionary["country_code"] as? String
countryName = dictionary["country_name"] as? String
diallingCode = dictionary["dialling_code"] as? String
}

/**
* Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
*/
func toDictionary() -> [String:Any]
{
var dictionary = [String:Any]()
if countryCode != nil{
dictionary["country_code"] = countryCode
}
if countryName != nil{
dictionary["country_name"] = countryName
}
if diallingCode != nil{
dictionary["dialling_code"] = diallingCode
}
return dictionary
}

/**
* NSCoding required initializer.
* Fills the data from the passed decoder
*/
@objc required init(coder aDecoder: NSCoder)
{
countryCode = aDecoder.decodeObject(forKey: "country_code") as? String
countryName = aDecoder.decodeObject(forKey: "country_name") as? String
diallingCode = aDecoder.decodeObject(forKey: "dialling_code") as? String
}

/**
* NSCoding required method.
* Encodes mode properties into the decoder
*/
@objc func encode(with aCoder: NSCoder)
{
if countryCode != nil{
aCoder.encode(countryCode, forKey: "country_code")
}
if countryName != nil{
aCoder.encode(countryName, forKey: "country_name")
}
if diallingCode != nil{
aCoder.encode(diallingCode, forKey: "dialling_code")
}
}
}


How do I use these models to get the value of to say India +91 code? I am new to swift so I am clueless as to how to use these models.



the method I know is simple method of ditionary



   fileprivate func loadNames(Country: String ) {

// //var countryCodes : [CountryCode]!
// var dict = [Coordinator]?.self
if let filePath = Bundle.main.path(forResource: "CountryCode", ofType: "json") {
if let jsonData = NSData(contentsOfFile: filePath) {


do {
// countryCodes = try? JSONDecoder().decode(CountryCode.self, from: jsonData as Data)
var countryCodes = try JSONSerialization.jsonObject(with: jsonData as Data, options: ) as? [String: Any]
// let countryCodes = try? JSONDecoder().decode(Welcome.self, from: jsonData as Data)
print ("country d ",countryCodes!)

let countryArray = countryCodes!["countryCodes"] as? NSArray
if countryArray!.count > 0
{
for countryElement in countryArray!
{
let dict = countryElement as! NSDictionary

if (dict["country_code"] as! String).description == countryCodeLocale
{
print("found ",(dict["dialling_code"] as! String ).description)
country_codeText.text = (dict["dialling_code"] as! String ).description
phone_NumberText.text = "99133131602"
return
}
}
}


} catch {
print(error.localizedDescription)
}





}
}
}
func fetchValues()
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
request.returnsObjectsAsFaults = false

do
{
let result = try context.fetch(request)
for data in result as! [NSManagedObject]
{
self.nameArr.append(data.value(forKey: "name") as! String)
self.lastNameArr.append(data.value(forKey: "lastname") as! String)
}
self.tableView.reloadData()

} catch {

print("Failed")
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.nameArr.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? testTVCell
cell?.nameLbl.text = self.nameArr[indexPath.row]
cell?.lastNameLbl.text = self.lastNameArr[indexPath.row]
cell?.deleteBtn.tag = indexPath.row

return cell!
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true

}
@IBAction func deleteAction(_ sender: UIButton) {

// self.nameArr.remove(at: sender.tag)
// self.lastNameArr.remove(at: sender.tag)
// self.tableView.reloadData()

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
fetchRequest.returnsObjectsAsFaults = false


let index = sender.tag
do
{
if let result = try? context.fetch(fetchRequest)
{

for object in result as! [NSManagedObject]

{
print(object.value(forKey: "name") as! String)

if ((object).value(forKey: "name") as! String).description == nameArr[index]
{
print(object.value(forKey: "name") as! String)
context.delete(object )
self.lastNameArr.remove(at: index)
self.nameArr.remove(at: index)
DispatchQueue.main.async
{
self.tableView.reloadData()

}
break
}
}
}
}
catch
{
print("error")
}


let _ : NSError! = nil
do {
try context.save()
self.tableView.reloadData()
} catch {
print("error : (error)")
}
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
print("Deleted")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
fetchRequest.returnsObjectsAsFaults = false


let index = indexPath.row
do
{
if let result = try? context.fetch(fetchRequest)
{

for object in result as! [NSManagedObject]

{
print(object.value(forKey: "name") as! String)

if ((object).value(forKey: "name") as! String).description == nameArr[index]
{
print(object.value(forKey: "name") as! String)
context.delete(object )

DispatchQueue.main.async
{

}
}
}
}
}
catch
{
print("error")
}


let _ : NSError! = nil
do {
try context.save()

} catch {
print("error : (error)")
}

self.lastNameArr.remove(at: index)
self.nameArr.remove(at: index)
self.tableView.deleteRows(at: [indexPath], with: .automatic)
}
@IBAction func submitTapped(_ sender: Any)
{
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "Testing", in: context)
let newUser = NSManagedObject(entity: entity!, insertInto: context)

newUser.setValue(self.nameTxt.text, forKey: "name")
newUser.setValue(self.lastNameTxt.text, forKey: "lastname")

do
{
try context.save()
}
catch
{
print("Failed saving")
}
}

func apiCall()
{
let urlString = "https://example.org"
let url = NSURL(string: urlString)
let request = NSMutableURLRequest(url: url! as URL)
activityView.startAnimating()
self.view.addSubview(activityView)
request.httpMethod = "GET"

let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

if error != nil
{
DispatchQueue.main.async
{
let alert = UIAlertController(title: "Network Connection Lost", message: "Please try again", preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .cancel, handler: { Void in
self.activityView.stopAnimating()
})
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
}
return
}
do
{
let result = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject
print(" JSON : ", result)
let a = result as! NSArray
let b = a[0] as! NSDictionary
print("name ", (b["Name"] as! String).description)

var nameArray = [String]()
for element in a
{

nameArray.append(((element as! NSDictionary)["Name"] as! String).description)
}
print("nameArray ", nameArray)
DispatchQueue.main.async
{
self.activityView.stopAnimating()
self.activityView.isHidden = true
}


}
catch
{
print("Error -> (error)")

DispatchQueue.main.async
{
self.activityView.stopAnimating()
let alert = UIAlertController(title: "Alert?", message: error as? String,preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
return
}
}
}
task.resume()
}
}


let indexpath = NSIndexPath(row: sender.tag, section: 0)

let cell = tableView.cellForRow(at: indexpath as IndexPath) as? testTVCell

if (self.tableView.isEditing) {
cell?.deleteBtn.setTitle("Edit", for: .normal)

self.tableView.setEditing(false, animated: true)
} else {
cell?.deleteBtn.setTitle("Done", for: .normal)

self.tableView.setEditing(true, animated: true)
}
{

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let urlString = appDelegate.serverUrl + "queryClassifiedList"
let url = NSURL(string: urlString)
let request = NSMutableURLRequest(url: url! as URL)
let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

spinner.progress = 0.0
self.view.addSubview(spinner)

request.httpMethod = "POST"

request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")

var dict : [AnyHashable: Any] = [
"channel" : appDelegate.channel,
"device" : appDelegate.deviceId,
"classifiedtype" : self.classifiedType,
"startnum" : startNum,
"endnum" : endNum
]

if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
{
let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!
dict["categoryid"] = categoryRow
}

if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
{
let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!
dict["city"] = cityId
}

let jsonData: Data? = try? JSONSerialization.data(withJSONObject: dict, options: )
request.httpBody = jsonData

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let urlString = appDelegate.serverUrl + "queryClassifiedList"
let url = NSURL(string: urlString)
let request = NSMutableURLRequest(url: url! as URL)
let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

spinner.progress = 0.0
self.view.addSubview(spinner)

request.httpMethod = "POST"

var bodyData : String!

bodyData = "channel=" + appDelegate.channel + "&device=" + appDelegate.deviceId + "&Classifiedtype=" + self.classifiedType.description + "&Startnum=" + startNum.description + "&Endnum=" + endNum.description

if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
{
let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!

bodyData = bodyData + "&Categoryid=" + categoryRow.description
}

if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
{
let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!

bodyData = bodyData + "&city=" + cityId.description
}

print("bodyData : ", bodyData)

request.httpBody = bodyData.data(using: String.Encoding.utf8)
}


but I want modal class method implementation. Can someone help?










share|improve this question




























    up vote
    -2
    down vote

    favorite












    I have a following sample json file I want to do it with modal classes but am not sure how to do this in code.



    {
    "countryCodes": [{
    "country_code": "AF",
    "country_name": "Afghanistan",
    "dialling_code": "+93"
    },
    {
    "country_code": "AL",
    "country_name": "Albania",
    "dialling_code": "+355"
    },
    {
    "country_code": "DZ",
    "country_name": "Algeria",
    "dialling_code": "+213"
    },
    {
    "country_code": "AS",
    "country_name": "American Samoa",
    "dialling_code": "+1"
    }
    ]
    }


    My modal class is as follows



    import Foundation
    class CountryModal : NSObject, NSCoding{

    var countryCodes : [CountryCode]!


    /**
    * Instantiate the instance using the passed dictionary values to set the properties values
    */
    init(fromDictionary dictionary: [String:Any]){
    countryCodes = [CountryCode]()
    if let countryCodesArray = dictionary["countryCodes"] as? [[String:Any]]{
    for dic in countryCodesArray{
    let value = CountryCode(fromDictionary: dic)
    countryCodes.append(value)
    }
    }
    }

    /**
    * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
    */
    func toDictionary() -> [String:Any]
    {
    var dictionary = [String:Any]()
    if countryCodes != nil{
    var dictionaryElements = [[String:Any]]()
    for countryCodesElement in countryCodes {
    dictionaryElements.append(countryCodesElement.toDictionary())
    }
    dictionary["countryCodes"] = dictionaryElements
    }
    return dictionary
    }

    /**
    * NSCoding required initializer.
    * Fills the data from the passed decoder
    */
    @objc required init(coder aDecoder: NSCoder)
    {
    countryCodes = aDecoder.decodeObject(forKey: "countryCodes") as? [CountryCode]
    }

    /**
    * NSCoding required method.
    * Encodes mode properties into the decoder
    */
    @objc func encode(with aCoder: NSCoder)
    {
    if countryCodes != nil{
    aCoder.encode(countryCodes, forKey: "countryCodes")
    }
    }
    }


    and



    import Foundation
    class CountryCode : NSObject, NSCoding{

    var countryCode : String!
    var countryName : String!
    var diallingCode : String!


    /**
    * Instantiate the instance using the passed dictionary values to set the properties values
    */
    init(fromDictionary dictionary: [String:Any]){
    countryCode = dictionary["country_code"] as? String
    countryName = dictionary["country_name"] as? String
    diallingCode = dictionary["dialling_code"] as? String
    }

    /**
    * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
    */
    func toDictionary() -> [String:Any]
    {
    var dictionary = [String:Any]()
    if countryCode != nil{
    dictionary["country_code"] = countryCode
    }
    if countryName != nil{
    dictionary["country_name"] = countryName
    }
    if diallingCode != nil{
    dictionary["dialling_code"] = diallingCode
    }
    return dictionary
    }

    /**
    * NSCoding required initializer.
    * Fills the data from the passed decoder
    */
    @objc required init(coder aDecoder: NSCoder)
    {
    countryCode = aDecoder.decodeObject(forKey: "country_code") as? String
    countryName = aDecoder.decodeObject(forKey: "country_name") as? String
    diallingCode = aDecoder.decodeObject(forKey: "dialling_code") as? String
    }

    /**
    * NSCoding required method.
    * Encodes mode properties into the decoder
    */
    @objc func encode(with aCoder: NSCoder)
    {
    if countryCode != nil{
    aCoder.encode(countryCode, forKey: "country_code")
    }
    if countryName != nil{
    aCoder.encode(countryName, forKey: "country_name")
    }
    if diallingCode != nil{
    aCoder.encode(diallingCode, forKey: "dialling_code")
    }
    }
    }


    How do I use these models to get the value of to say India +91 code? I am new to swift so I am clueless as to how to use these models.



    the method I know is simple method of ditionary



       fileprivate func loadNames(Country: String ) {

    // //var countryCodes : [CountryCode]!
    // var dict = [Coordinator]?.self
    if let filePath = Bundle.main.path(forResource: "CountryCode", ofType: "json") {
    if let jsonData = NSData(contentsOfFile: filePath) {


    do {
    // countryCodes = try? JSONDecoder().decode(CountryCode.self, from: jsonData as Data)
    var countryCodes = try JSONSerialization.jsonObject(with: jsonData as Data, options: ) as? [String: Any]
    // let countryCodes = try? JSONDecoder().decode(Welcome.self, from: jsonData as Data)
    print ("country d ",countryCodes!)

    let countryArray = countryCodes!["countryCodes"] as? NSArray
    if countryArray!.count > 0
    {
    for countryElement in countryArray!
    {
    let dict = countryElement as! NSDictionary

    if (dict["country_code"] as! String).description == countryCodeLocale
    {
    print("found ",(dict["dialling_code"] as! String ).description)
    country_codeText.text = (dict["dialling_code"] as! String ).description
    phone_NumberText.text = "99133131602"
    return
    }
    }
    }


    } catch {
    print(error.localizedDescription)
    }





    }
    }
    }
    func fetchValues()
    {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
    request.returnsObjectsAsFaults = false

    do
    {
    let result = try context.fetch(request)
    for data in result as! [NSManagedObject]
    {
    self.nameArr.append(data.value(forKey: "name") as! String)
    self.lastNameArr.append(data.value(forKey: "lastname") as! String)
    }
    self.tableView.reloadData()

    } catch {

    print("Failed")
    }
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
    return self.nameArr.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? testTVCell
    cell?.nameLbl.text = self.nameArr[indexPath.row]
    cell?.lastNameLbl.text = self.lastNameArr[indexPath.row]
    cell?.deleteBtn.tag = indexPath.row

    return cell!
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
    {
    return UITableView.automaticDimension
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true

    }
    @IBAction func deleteAction(_ sender: UIButton) {

    // self.nameArr.remove(at: sender.tag)
    // self.lastNameArr.remove(at: sender.tag)
    // self.tableView.reloadData()

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
    fetchRequest.returnsObjectsAsFaults = false


    let index = sender.tag
    do
    {
    if let result = try? context.fetch(fetchRequest)
    {

    for object in result as! [NSManagedObject]

    {
    print(object.value(forKey: "name") as! String)

    if ((object).value(forKey: "name") as! String).description == nameArr[index]
    {
    print(object.value(forKey: "name") as! String)
    context.delete(object )
    self.lastNameArr.remove(at: index)
    self.nameArr.remove(at: index)
    DispatchQueue.main.async
    {
    self.tableView.reloadData()

    }
    break
    }
    }
    }
    }
    catch
    {
    print("error")
    }


    let _ : NSError! = nil
    do {
    try context.save()
    self.tableView.reloadData()
    } catch {
    print("error : (error)")
    }
    }
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
    print("Deleted")
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
    fetchRequest.returnsObjectsAsFaults = false


    let index = indexPath.row
    do
    {
    if let result = try? context.fetch(fetchRequest)
    {

    for object in result as! [NSManagedObject]

    {
    print(object.value(forKey: "name") as! String)

    if ((object).value(forKey: "name") as! String).description == nameArr[index]
    {
    print(object.value(forKey: "name") as! String)
    context.delete(object )

    DispatchQueue.main.async
    {

    }
    }
    }
    }
    }
    catch
    {
    print("error")
    }


    let _ : NSError! = nil
    do {
    try context.save()

    } catch {
    print("error : (error)")
    }

    self.lastNameArr.remove(at: index)
    self.nameArr.remove(at: index)
    self.tableView.deleteRows(at: [indexPath], with: .automatic)
    }
    @IBAction func submitTapped(_ sender: Any)
    {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let entity = NSEntityDescription.entity(forEntityName: "Testing", in: context)
    let newUser = NSManagedObject(entity: entity!, insertInto: context)

    newUser.setValue(self.nameTxt.text, forKey: "name")
    newUser.setValue(self.lastNameTxt.text, forKey: "lastname")

    do
    {
    try context.save()
    }
    catch
    {
    print("Failed saving")
    }
    }

    func apiCall()
    {
    let urlString = "https://example.org"
    let url = NSURL(string: urlString)
    let request = NSMutableURLRequest(url: url! as URL)
    activityView.startAnimating()
    self.view.addSubview(activityView)
    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

    if error != nil
    {
    DispatchQueue.main.async
    {
    let alert = UIAlertController(title: "Network Connection Lost", message: "Please try again", preferredStyle: .alert)
    let ok = UIAlertAction(title: "OK", style: .cancel, handler: { Void in
    self.activityView.stopAnimating()
    })
    alert.addAction(ok)
    self.present(alert, animated: true, completion: nil)
    }
    return
    }
    do
    {
    let result = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject
    print(" JSON : ", result)
    let a = result as! NSArray
    let b = a[0] as! NSDictionary
    print("name ", (b["Name"] as! String).description)

    var nameArray = [String]()
    for element in a
    {

    nameArray.append(((element as! NSDictionary)["Name"] as! String).description)
    }
    print("nameArray ", nameArray)
    DispatchQueue.main.async
    {
    self.activityView.stopAnimating()
    self.activityView.isHidden = true
    }


    }
    catch
    {
    print("Error -> (error)")

    DispatchQueue.main.async
    {
    self.activityView.stopAnimating()
    let alert = UIAlertController(title: "Alert?", message: error as? String,preferredStyle: .alert)
    let ok = UIAlertAction(title: "OK", style: .cancel, handler: nil)
    alert.addAction(ok)
    self.present(alert, animated: true, completion: nil)
    return
    }
    }
    }
    task.resume()
    }
    }


    let indexpath = NSIndexPath(row: sender.tag, section: 0)

    let cell = tableView.cellForRow(at: indexpath as IndexPath) as? testTVCell

    if (self.tableView.isEditing) {
    cell?.deleteBtn.setTitle("Edit", for: .normal)

    self.tableView.setEditing(false, animated: true)
    } else {
    cell?.deleteBtn.setTitle("Done", for: .normal)

    self.tableView.setEditing(true, animated: true)
    }
    {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let urlString = appDelegate.serverUrl + "queryClassifiedList"
    let url = NSURL(string: urlString)
    let request = NSMutableURLRequest(url: url! as URL)
    let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

    spinner.progress = 0.0
    self.view.addSubview(spinner)

    request.httpMethod = "POST"

    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")

    var dict : [AnyHashable: Any] = [
    "channel" : appDelegate.channel,
    "device" : appDelegate.deviceId,
    "classifiedtype" : self.classifiedType,
    "startnum" : startNum,
    "endnum" : endNum
    ]

    if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
    {
    let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!
    dict["categoryid"] = categoryRow
    }

    if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
    {
    let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!
    dict["city"] = cityId
    }

    let jsonData: Data? = try? JSONSerialization.data(withJSONObject: dict, options: )
    request.httpBody = jsonData

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let urlString = appDelegate.serverUrl + "queryClassifiedList"
    let url = NSURL(string: urlString)
    let request = NSMutableURLRequest(url: url! as URL)
    let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

    spinner.progress = 0.0
    self.view.addSubview(spinner)

    request.httpMethod = "POST"

    var bodyData : String!

    bodyData = "channel=" + appDelegate.channel + "&device=" + appDelegate.deviceId + "&Classifiedtype=" + self.classifiedType.description + "&Startnum=" + startNum.description + "&Endnum=" + endNum.description

    if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
    {
    let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!

    bodyData = bodyData + "&Categoryid=" + categoryRow.description
    }

    if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
    {
    let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!

    bodyData = bodyData + "&city=" + cityId.description
    }

    print("bodyData : ", bodyData)

    request.httpBody = bodyData.data(using: String.Encoding.utf8)
    }


    but I want modal class method implementation. Can someone help?










    share|improve this question


























      up vote
      -2
      down vote

      favorite









      up vote
      -2
      down vote

      favorite











      I have a following sample json file I want to do it with modal classes but am not sure how to do this in code.



      {
      "countryCodes": [{
      "country_code": "AF",
      "country_name": "Afghanistan",
      "dialling_code": "+93"
      },
      {
      "country_code": "AL",
      "country_name": "Albania",
      "dialling_code": "+355"
      },
      {
      "country_code": "DZ",
      "country_name": "Algeria",
      "dialling_code": "+213"
      },
      {
      "country_code": "AS",
      "country_name": "American Samoa",
      "dialling_code": "+1"
      }
      ]
      }


      My modal class is as follows



      import Foundation
      class CountryModal : NSObject, NSCoding{

      var countryCodes : [CountryCode]!


      /**
      * Instantiate the instance using the passed dictionary values to set the properties values
      */
      init(fromDictionary dictionary: [String:Any]){
      countryCodes = [CountryCode]()
      if let countryCodesArray = dictionary["countryCodes"] as? [[String:Any]]{
      for dic in countryCodesArray{
      let value = CountryCode(fromDictionary: dic)
      countryCodes.append(value)
      }
      }
      }

      /**
      * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
      */
      func toDictionary() -> [String:Any]
      {
      var dictionary = [String:Any]()
      if countryCodes != nil{
      var dictionaryElements = [[String:Any]]()
      for countryCodesElement in countryCodes {
      dictionaryElements.append(countryCodesElement.toDictionary())
      }
      dictionary["countryCodes"] = dictionaryElements
      }
      return dictionary
      }

      /**
      * NSCoding required initializer.
      * Fills the data from the passed decoder
      */
      @objc required init(coder aDecoder: NSCoder)
      {
      countryCodes = aDecoder.decodeObject(forKey: "countryCodes") as? [CountryCode]
      }

      /**
      * NSCoding required method.
      * Encodes mode properties into the decoder
      */
      @objc func encode(with aCoder: NSCoder)
      {
      if countryCodes != nil{
      aCoder.encode(countryCodes, forKey: "countryCodes")
      }
      }
      }


      and



      import Foundation
      class CountryCode : NSObject, NSCoding{

      var countryCode : String!
      var countryName : String!
      var diallingCode : String!


      /**
      * Instantiate the instance using the passed dictionary values to set the properties values
      */
      init(fromDictionary dictionary: [String:Any]){
      countryCode = dictionary["country_code"] as? String
      countryName = dictionary["country_name"] as? String
      diallingCode = dictionary["dialling_code"] as? String
      }

      /**
      * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
      */
      func toDictionary() -> [String:Any]
      {
      var dictionary = [String:Any]()
      if countryCode != nil{
      dictionary["country_code"] = countryCode
      }
      if countryName != nil{
      dictionary["country_name"] = countryName
      }
      if diallingCode != nil{
      dictionary["dialling_code"] = diallingCode
      }
      return dictionary
      }

      /**
      * NSCoding required initializer.
      * Fills the data from the passed decoder
      */
      @objc required init(coder aDecoder: NSCoder)
      {
      countryCode = aDecoder.decodeObject(forKey: "country_code") as? String
      countryName = aDecoder.decodeObject(forKey: "country_name") as? String
      diallingCode = aDecoder.decodeObject(forKey: "dialling_code") as? String
      }

      /**
      * NSCoding required method.
      * Encodes mode properties into the decoder
      */
      @objc func encode(with aCoder: NSCoder)
      {
      if countryCode != nil{
      aCoder.encode(countryCode, forKey: "country_code")
      }
      if countryName != nil{
      aCoder.encode(countryName, forKey: "country_name")
      }
      if diallingCode != nil{
      aCoder.encode(diallingCode, forKey: "dialling_code")
      }
      }
      }


      How do I use these models to get the value of to say India +91 code? I am new to swift so I am clueless as to how to use these models.



      the method I know is simple method of ditionary



         fileprivate func loadNames(Country: String ) {

      // //var countryCodes : [CountryCode]!
      // var dict = [Coordinator]?.self
      if let filePath = Bundle.main.path(forResource: "CountryCode", ofType: "json") {
      if let jsonData = NSData(contentsOfFile: filePath) {


      do {
      // countryCodes = try? JSONDecoder().decode(CountryCode.self, from: jsonData as Data)
      var countryCodes = try JSONSerialization.jsonObject(with: jsonData as Data, options: ) as? [String: Any]
      // let countryCodes = try? JSONDecoder().decode(Welcome.self, from: jsonData as Data)
      print ("country d ",countryCodes!)

      let countryArray = countryCodes!["countryCodes"] as? NSArray
      if countryArray!.count > 0
      {
      for countryElement in countryArray!
      {
      let dict = countryElement as! NSDictionary

      if (dict["country_code"] as! String).description == countryCodeLocale
      {
      print("found ",(dict["dialling_code"] as! String ).description)
      country_codeText.text = (dict["dialling_code"] as! String ).description
      phone_NumberText.text = "99133131602"
      return
      }
      }
      }


      } catch {
      print(error.localizedDescription)
      }





      }
      }
      }
      func fetchValues()
      {
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      request.returnsObjectsAsFaults = false

      do
      {
      let result = try context.fetch(request)
      for data in result as! [NSManagedObject]
      {
      self.nameArr.append(data.value(forKey: "name") as! String)
      self.lastNameArr.append(data.value(forKey: "lastname") as! String)
      }
      self.tableView.reloadData()

      } catch {

      print("Failed")
      }
      }
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
      {
      return self.nameArr.count
      }
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
      {
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? testTVCell
      cell?.nameLbl.text = self.nameArr[indexPath.row]
      cell?.lastNameLbl.text = self.lastNameArr[indexPath.row]
      cell?.deleteBtn.tag = indexPath.row

      return cell!
      }
      func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
      {
      return UITableView.automaticDimension
      }

      func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
      return true

      }
      @IBAction func deleteAction(_ sender: UIButton) {

      // self.nameArr.remove(at: sender.tag)
      // self.lastNameArr.remove(at: sender.tag)
      // self.tableView.reloadData()

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      fetchRequest.returnsObjectsAsFaults = false


      let index = sender.tag
      do
      {
      if let result = try? context.fetch(fetchRequest)
      {

      for object in result as! [NSManagedObject]

      {
      print(object.value(forKey: "name") as! String)

      if ((object).value(forKey: "name") as! String).description == nameArr[index]
      {
      print(object.value(forKey: "name") as! String)
      context.delete(object )
      self.lastNameArr.remove(at: index)
      self.nameArr.remove(at: index)
      DispatchQueue.main.async
      {
      self.tableView.reloadData()

      }
      break
      }
      }
      }
      }
      catch
      {
      print("error")
      }


      let _ : NSError! = nil
      do {
      try context.save()
      self.tableView.reloadData()
      } catch {
      print("error : (error)")
      }
      }
      func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
      if editingStyle == .delete {
      print("Deleted")
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      fetchRequest.returnsObjectsAsFaults = false


      let index = indexPath.row
      do
      {
      if let result = try? context.fetch(fetchRequest)
      {

      for object in result as! [NSManagedObject]

      {
      print(object.value(forKey: "name") as! String)

      if ((object).value(forKey: "name") as! String).description == nameArr[index]
      {
      print(object.value(forKey: "name") as! String)
      context.delete(object )

      DispatchQueue.main.async
      {

      }
      }
      }
      }
      }
      catch
      {
      print("error")
      }


      let _ : NSError! = nil
      do {
      try context.save()

      } catch {
      print("error : (error)")
      }

      self.lastNameArr.remove(at: index)
      self.nameArr.remove(at: index)
      self.tableView.deleteRows(at: [indexPath], with: .automatic)
      }
      @IBAction func submitTapped(_ sender: Any)
      {
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext
      let entity = NSEntityDescription.entity(forEntityName: "Testing", in: context)
      let newUser = NSManagedObject(entity: entity!, insertInto: context)

      newUser.setValue(self.nameTxt.text, forKey: "name")
      newUser.setValue(self.lastNameTxt.text, forKey: "lastname")

      do
      {
      try context.save()
      }
      catch
      {
      print("Failed saving")
      }
      }

      func apiCall()
      {
      let urlString = "https://example.org"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      activityView.startAnimating()
      self.view.addSubview(activityView)
      request.httpMethod = "GET"

      let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

      if error != nil
      {
      DispatchQueue.main.async
      {
      let alert = UIAlertController(title: "Network Connection Lost", message: "Please try again", preferredStyle: .alert)
      let ok = UIAlertAction(title: "OK", style: .cancel, handler: { Void in
      self.activityView.stopAnimating()
      })
      alert.addAction(ok)
      self.present(alert, animated: true, completion: nil)
      }
      return
      }
      do
      {
      let result = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject
      print(" JSON : ", result)
      let a = result as! NSArray
      let b = a[0] as! NSDictionary
      print("name ", (b["Name"] as! String).description)

      var nameArray = [String]()
      for element in a
      {

      nameArray.append(((element as! NSDictionary)["Name"] as! String).description)
      }
      print("nameArray ", nameArray)
      DispatchQueue.main.async
      {
      self.activityView.stopAnimating()
      self.activityView.isHidden = true
      }


      }
      catch
      {
      print("Error -> (error)")

      DispatchQueue.main.async
      {
      self.activityView.stopAnimating()
      let alert = UIAlertController(title: "Alert?", message: error as? String,preferredStyle: .alert)
      let ok = UIAlertAction(title: "OK", style: .cancel, handler: nil)
      alert.addAction(ok)
      self.present(alert, animated: true, completion: nil)
      return
      }
      }
      }
      task.resume()
      }
      }


      let indexpath = NSIndexPath(row: sender.tag, section: 0)

      let cell = tableView.cellForRow(at: indexpath as IndexPath) as? testTVCell

      if (self.tableView.isEditing) {
      cell?.deleteBtn.setTitle("Edit", for: .normal)

      self.tableView.setEditing(false, animated: true)
      } else {
      cell?.deleteBtn.setTitle("Done", for: .normal)

      self.tableView.setEditing(true, animated: true)
      }
      {

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let urlString = appDelegate.serverUrl + "queryClassifiedList"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

      spinner.progress = 0.0
      self.view.addSubview(spinner)

      request.httpMethod = "POST"

      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")

      var dict : [AnyHashable: Any] = [
      "channel" : appDelegate.channel,
      "device" : appDelegate.deviceId,
      "classifiedtype" : self.classifiedType,
      "startnum" : startNum,
      "endnum" : endNum
      ]

      if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
      {
      let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!
      dict["categoryid"] = categoryRow
      }

      if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
      {
      let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!
      dict["city"] = cityId
      }

      let jsonData: Data? = try? JSONSerialization.data(withJSONObject: dict, options: )
      request.httpBody = jsonData

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let urlString = appDelegate.serverUrl + "queryClassifiedList"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

      spinner.progress = 0.0
      self.view.addSubview(spinner)

      request.httpMethod = "POST"

      var bodyData : String!

      bodyData = "channel=" + appDelegate.channel + "&device=" + appDelegate.deviceId + "&Classifiedtype=" + self.classifiedType.description + "&Startnum=" + startNum.description + "&Endnum=" + endNum.description

      if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
      {
      let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!

      bodyData = bodyData + "&Categoryid=" + categoryRow.description
      }

      if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
      {
      let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!

      bodyData = bodyData + "&city=" + cityId.description
      }

      print("bodyData : ", bodyData)

      request.httpBody = bodyData.data(using: String.Encoding.utf8)
      }


      but I want modal class method implementation. Can someone help?










      share|improve this question















      I have a following sample json file I want to do it with modal classes but am not sure how to do this in code.



      {
      "countryCodes": [{
      "country_code": "AF",
      "country_name": "Afghanistan",
      "dialling_code": "+93"
      },
      {
      "country_code": "AL",
      "country_name": "Albania",
      "dialling_code": "+355"
      },
      {
      "country_code": "DZ",
      "country_name": "Algeria",
      "dialling_code": "+213"
      },
      {
      "country_code": "AS",
      "country_name": "American Samoa",
      "dialling_code": "+1"
      }
      ]
      }


      My modal class is as follows



      import Foundation
      class CountryModal : NSObject, NSCoding{

      var countryCodes : [CountryCode]!


      /**
      * Instantiate the instance using the passed dictionary values to set the properties values
      */
      init(fromDictionary dictionary: [String:Any]){
      countryCodes = [CountryCode]()
      if let countryCodesArray = dictionary["countryCodes"] as? [[String:Any]]{
      for dic in countryCodesArray{
      let value = CountryCode(fromDictionary: dic)
      countryCodes.append(value)
      }
      }
      }

      /**
      * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
      */
      func toDictionary() -> [String:Any]
      {
      var dictionary = [String:Any]()
      if countryCodes != nil{
      var dictionaryElements = [[String:Any]]()
      for countryCodesElement in countryCodes {
      dictionaryElements.append(countryCodesElement.toDictionary())
      }
      dictionary["countryCodes"] = dictionaryElements
      }
      return dictionary
      }

      /**
      * NSCoding required initializer.
      * Fills the data from the passed decoder
      */
      @objc required init(coder aDecoder: NSCoder)
      {
      countryCodes = aDecoder.decodeObject(forKey: "countryCodes") as? [CountryCode]
      }

      /**
      * NSCoding required method.
      * Encodes mode properties into the decoder
      */
      @objc func encode(with aCoder: NSCoder)
      {
      if countryCodes != nil{
      aCoder.encode(countryCodes, forKey: "countryCodes")
      }
      }
      }


      and



      import Foundation
      class CountryCode : NSObject, NSCoding{

      var countryCode : String!
      var countryName : String!
      var diallingCode : String!


      /**
      * Instantiate the instance using the passed dictionary values to set the properties values
      */
      init(fromDictionary dictionary: [String:Any]){
      countryCode = dictionary["country_code"] as? String
      countryName = dictionary["country_name"] as? String
      diallingCode = dictionary["dialling_code"] as? String
      }

      /**
      * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
      */
      func toDictionary() -> [String:Any]
      {
      var dictionary = [String:Any]()
      if countryCode != nil{
      dictionary["country_code"] = countryCode
      }
      if countryName != nil{
      dictionary["country_name"] = countryName
      }
      if diallingCode != nil{
      dictionary["dialling_code"] = diallingCode
      }
      return dictionary
      }

      /**
      * NSCoding required initializer.
      * Fills the data from the passed decoder
      */
      @objc required init(coder aDecoder: NSCoder)
      {
      countryCode = aDecoder.decodeObject(forKey: "country_code") as? String
      countryName = aDecoder.decodeObject(forKey: "country_name") as? String
      diallingCode = aDecoder.decodeObject(forKey: "dialling_code") as? String
      }

      /**
      * NSCoding required method.
      * Encodes mode properties into the decoder
      */
      @objc func encode(with aCoder: NSCoder)
      {
      if countryCode != nil{
      aCoder.encode(countryCode, forKey: "country_code")
      }
      if countryName != nil{
      aCoder.encode(countryName, forKey: "country_name")
      }
      if diallingCode != nil{
      aCoder.encode(diallingCode, forKey: "dialling_code")
      }
      }
      }


      How do I use these models to get the value of to say India +91 code? I am new to swift so I am clueless as to how to use these models.



      the method I know is simple method of ditionary



         fileprivate func loadNames(Country: String ) {

      // //var countryCodes : [CountryCode]!
      // var dict = [Coordinator]?.self
      if let filePath = Bundle.main.path(forResource: "CountryCode", ofType: "json") {
      if let jsonData = NSData(contentsOfFile: filePath) {


      do {
      // countryCodes = try? JSONDecoder().decode(CountryCode.self, from: jsonData as Data)
      var countryCodes = try JSONSerialization.jsonObject(with: jsonData as Data, options: ) as? [String: Any]
      // let countryCodes = try? JSONDecoder().decode(Welcome.self, from: jsonData as Data)
      print ("country d ",countryCodes!)

      let countryArray = countryCodes!["countryCodes"] as? NSArray
      if countryArray!.count > 0
      {
      for countryElement in countryArray!
      {
      let dict = countryElement as! NSDictionary

      if (dict["country_code"] as! String).description == countryCodeLocale
      {
      print("found ",(dict["dialling_code"] as! String ).description)
      country_codeText.text = (dict["dialling_code"] as! String ).description
      phone_NumberText.text = "99133131602"
      return
      }
      }
      }


      } catch {
      print(error.localizedDescription)
      }





      }
      }
      }
      func fetchValues()
      {
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      request.returnsObjectsAsFaults = false

      do
      {
      let result = try context.fetch(request)
      for data in result as! [NSManagedObject]
      {
      self.nameArr.append(data.value(forKey: "name") as! String)
      self.lastNameArr.append(data.value(forKey: "lastname") as! String)
      }
      self.tableView.reloadData()

      } catch {

      print("Failed")
      }
      }
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
      {
      return self.nameArr.count
      }
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
      {
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? testTVCell
      cell?.nameLbl.text = self.nameArr[indexPath.row]
      cell?.lastNameLbl.text = self.lastNameArr[indexPath.row]
      cell?.deleteBtn.tag = indexPath.row

      return cell!
      }
      func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
      {
      return UITableView.automaticDimension
      }

      func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
      return true

      }
      @IBAction func deleteAction(_ sender: UIButton) {

      // self.nameArr.remove(at: sender.tag)
      // self.lastNameArr.remove(at: sender.tag)
      // self.tableView.reloadData()

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      fetchRequest.returnsObjectsAsFaults = false


      let index = sender.tag
      do
      {
      if let result = try? context.fetch(fetchRequest)
      {

      for object in result as! [NSManagedObject]

      {
      print(object.value(forKey: "name") as! String)

      if ((object).value(forKey: "name") as! String).description == nameArr[index]
      {
      print(object.value(forKey: "name") as! String)
      context.delete(object )
      self.lastNameArr.remove(at: index)
      self.nameArr.remove(at: index)
      DispatchQueue.main.async
      {
      self.tableView.reloadData()

      }
      break
      }
      }
      }
      }
      catch
      {
      print("error")
      }


      let _ : NSError! = nil
      do {
      try context.save()
      self.tableView.reloadData()
      } catch {
      print("error : (error)")
      }
      }
      func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
      if editingStyle == .delete {
      print("Deleted")
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext

      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Testing")
      fetchRequest.returnsObjectsAsFaults = false


      let index = indexPath.row
      do
      {
      if let result = try? context.fetch(fetchRequest)
      {

      for object in result as! [NSManagedObject]

      {
      print(object.value(forKey: "name") as! String)

      if ((object).value(forKey: "name") as! String).description == nameArr[index]
      {
      print(object.value(forKey: "name") as! String)
      context.delete(object )

      DispatchQueue.main.async
      {

      }
      }
      }
      }
      }
      catch
      {
      print("error")
      }


      let _ : NSError! = nil
      do {
      try context.save()

      } catch {
      print("error : (error)")
      }

      self.lastNameArr.remove(at: index)
      self.nameArr.remove(at: index)
      self.tableView.deleteRows(at: [indexPath], with: .automatic)
      }
      @IBAction func submitTapped(_ sender: Any)
      {
      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let context = appDelegate.persistentContainer.viewContext
      let entity = NSEntityDescription.entity(forEntityName: "Testing", in: context)
      let newUser = NSManagedObject(entity: entity!, insertInto: context)

      newUser.setValue(self.nameTxt.text, forKey: "name")
      newUser.setValue(self.lastNameTxt.text, forKey: "lastname")

      do
      {
      try context.save()
      }
      catch
      {
      print("Failed saving")
      }
      }

      func apiCall()
      {
      let urlString = "https://example.org"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      activityView.startAnimating()
      self.view.addSubview(activityView)
      request.httpMethod = "GET"

      let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

      if error != nil
      {
      DispatchQueue.main.async
      {
      let alert = UIAlertController(title: "Network Connection Lost", message: "Please try again", preferredStyle: .alert)
      let ok = UIAlertAction(title: "OK", style: .cancel, handler: { Void in
      self.activityView.stopAnimating()
      })
      alert.addAction(ok)
      self.present(alert, animated: true, completion: nil)
      }
      return
      }
      do
      {
      let result = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as AnyObject
      print(" JSON : ", result)
      let a = result as! NSArray
      let b = a[0] as! NSDictionary
      print("name ", (b["Name"] as! String).description)

      var nameArray = [String]()
      for element in a
      {

      nameArray.append(((element as! NSDictionary)["Name"] as! String).description)
      }
      print("nameArray ", nameArray)
      DispatchQueue.main.async
      {
      self.activityView.stopAnimating()
      self.activityView.isHidden = true
      }


      }
      catch
      {
      print("Error -> (error)")

      DispatchQueue.main.async
      {
      self.activityView.stopAnimating()
      let alert = UIAlertController(title: "Alert?", message: error as? String,preferredStyle: .alert)
      let ok = UIAlertAction(title: "OK", style: .cancel, handler: nil)
      alert.addAction(ok)
      self.present(alert, animated: true, completion: nil)
      return
      }
      }
      }
      task.resume()
      }
      }


      let indexpath = NSIndexPath(row: sender.tag, section: 0)

      let cell = tableView.cellForRow(at: indexpath as IndexPath) as? testTVCell

      if (self.tableView.isEditing) {
      cell?.deleteBtn.setTitle("Edit", for: .normal)

      self.tableView.setEditing(false, animated: true)
      } else {
      cell?.deleteBtn.setTitle("Done", for: .normal)

      self.tableView.setEditing(true, animated: true)
      }
      {

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let urlString = appDelegate.serverUrl + "queryClassifiedList"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

      spinner.progress = 0.0
      self.view.addSubview(spinner)

      request.httpMethod = "POST"

      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")

      var dict : [AnyHashable: Any] = [
      "channel" : appDelegate.channel,
      "device" : appDelegate.deviceId,
      "classifiedtype" : self.classifiedType,
      "startnum" : startNum,
      "endnum" : endNum
      ]

      if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
      {
      let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!
      dict["categoryid"] = categoryRow
      }

      if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
      {
      let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!
      dict["city"] = cityId
      }

      let jsonData: Data? = try? JSONSerialization.data(withJSONObject: dict, options: )
      request.httpBody = jsonData

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
      let urlString = appDelegate.serverUrl + "queryClassifiedList"
      let url = NSURL(string: urlString)
      let request = NSMutableURLRequest(url: url! as URL)
      let spinner = JHSpinnerView.showDeterminiteSpinnerOnView(self.view)

      spinner.progress = 0.0
      self.view.addSubview(spinner)

      request.httpMethod = "POST"

      var bodyData : String!

      bodyData = "channel=" + appDelegate.channel + "&device=" + appDelegate.deviceId + "&Classifiedtype=" + self.classifiedType.description + "&Startnum=" + startNum.description + "&Endnum=" + endNum.description

      if UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != nil && UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int != -1
      {
      let categoryRow = (UserDefaults.standard.value(forKey: "categoryClassifiedFilter") as? Int)!

      bodyData = bodyData + "&Categoryid=" + categoryRow.description
      }

      if UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != nil && UserDefaults.standard.value(forKey: "cityRowFilter") as? Int != -1
      {
      let cityId = (UserDefaults.standard.value(forKey: "cityRowFilter") as? Int)!

      bodyData = bodyData + "&city=" + cityId.description
      }

      print("bodyData : ", bodyData)

      request.httpBody = bodyData.data(using: String.Encoding.utf8)
      }


      but I want modal class method implementation. Can someone help?







      ios swift4






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 28 at 2:48

























      asked Nov 22 at 10:44









      iOSBoy

      82




      82
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote



          accepted










          You can try



          struct Root: Codable {
          let countryCodes: [CountryCode]
          }

          struct CountryCode: Codable {
          let countryCode, countryName, diallingCode: String

          enum CodingKeys: String, CodingKey {
          case countryCode = "country_code"
          case countryName = "country_name"
          case diallingCode = "dialling_code"
          }
          }




          let res = try? JSONDecoder().decode(Root.self,from:jsonData)
          print(res.countryCodes)

          res.countryCodes.forEach {
          if $0.countryCode == "DZ" {
          print($0.diallingCode)
          }
          }





          share|improve this answer























          • hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
            – iOSBoy
            Nov 22 at 10:49








          • 1




            ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
            – iOSBoy
            Nov 22 at 11:11











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429164%2fhow-to-use-codable-and-decodable-for-the-following-json%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote



          accepted










          You can try



          struct Root: Codable {
          let countryCodes: [CountryCode]
          }

          struct CountryCode: Codable {
          let countryCode, countryName, diallingCode: String

          enum CodingKeys: String, CodingKey {
          case countryCode = "country_code"
          case countryName = "country_name"
          case diallingCode = "dialling_code"
          }
          }




          let res = try? JSONDecoder().decode(Root.self,from:jsonData)
          print(res.countryCodes)

          res.countryCodes.forEach {
          if $0.countryCode == "DZ" {
          print($0.diallingCode)
          }
          }





          share|improve this answer























          • hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
            – iOSBoy
            Nov 22 at 10:49








          • 1




            ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
            – iOSBoy
            Nov 22 at 11:11















          up vote
          0
          down vote



          accepted










          You can try



          struct Root: Codable {
          let countryCodes: [CountryCode]
          }

          struct CountryCode: Codable {
          let countryCode, countryName, diallingCode: String

          enum CodingKeys: String, CodingKey {
          case countryCode = "country_code"
          case countryName = "country_name"
          case diallingCode = "dialling_code"
          }
          }




          let res = try? JSONDecoder().decode(Root.self,from:jsonData)
          print(res.countryCodes)

          res.countryCodes.forEach {
          if $0.countryCode == "DZ" {
          print($0.diallingCode)
          }
          }





          share|improve this answer























          • hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
            – iOSBoy
            Nov 22 at 10:49








          • 1




            ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
            – iOSBoy
            Nov 22 at 11:11













          up vote
          0
          down vote



          accepted







          up vote
          0
          down vote



          accepted






          You can try



          struct Root: Codable {
          let countryCodes: [CountryCode]
          }

          struct CountryCode: Codable {
          let countryCode, countryName, diallingCode: String

          enum CodingKeys: String, CodingKey {
          case countryCode = "country_code"
          case countryName = "country_name"
          case diallingCode = "dialling_code"
          }
          }




          let res = try? JSONDecoder().decode(Root.self,from:jsonData)
          print(res.countryCodes)

          res.countryCodes.forEach {
          if $0.countryCode == "DZ" {
          print($0.diallingCode)
          }
          }





          share|improve this answer














          You can try



          struct Root: Codable {
          let countryCodes: [CountryCode]
          }

          struct CountryCode: Codable {
          let countryCode, countryName, diallingCode: String

          enum CodingKeys: String, CodingKey {
          case countryCode = "country_code"
          case countryName = "country_name"
          case diallingCode = "dialling_code"
          }
          }




          let res = try? JSONDecoder().decode(Root.self,from:jsonData)
          print(res.countryCodes)

          res.countryCodes.forEach {
          if $0.countryCode == "DZ" {
          print($0.diallingCode)
          }
          }






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 22 at 10:54

























          answered Nov 22 at 10:47









          Sh_Khan

          37k51125




          37k51125












          • hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
            – iOSBoy
            Nov 22 at 10:49








          • 1




            ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
            – iOSBoy
            Nov 22 at 11:11


















          • hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
            – iOSBoy
            Nov 22 at 10:49








          • 1




            ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
            – iOSBoy
            Nov 22 at 11:11
















          hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
          – iOSBoy
          Nov 22 at 10:49






          hello, how do I use this struct, suppose in a VC where i want to get a specific country dialing code? for eg if let jsonData = NSData(contentsOfFile: filePath) {} after this what should i write?
          – iOSBoy
          Nov 22 at 10:49






          1




          1




          ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
          – iOSBoy
          Nov 22 at 11:11




          ok thanks res.countryCodes.forEach { if $0.countryCode == "DZ" { print($0.diallingCode) } } this worked
          – iOSBoy
          Nov 22 at 11:11


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53429164%2fhow-to-use-codable-and-decodable-for-the-following-json%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

          Calculate evaluation metrics using cross_val_predict sklearn

          Insert data from modal to MySQL (multiple modal on website)