Below is a function that I am trying to create that will get the values in JSON data based on the key value entered. The problem I am having is I need Need to be able to use all the rates in another calculation. I am not sure how to get each rate saved to a global variable. At this point, the function is giving me an error - "Missing Return in a function expecting to return a string". Any ideas how to solve this problem
func getLenderData(selectedLenderKey: String) -> String
{
let url = ""
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print("Error")
}
else{
do{
//let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
//print(fecthdata)
let swiftyJSON = try JSON(data:data!)
let lenderName = swiftyJSON["lenders"][selectedLenderKey]["financial_institution"].stringValue
let oneYear = swiftyJSON["lenders"][selectedLenderKey]["one_year"].stringValue
let twoYear = swiftyJSON["lenders"][selectedLenderKey]["two_year"].stringValue
let threeYear = swiftyJSON["lenders"][selectedLenderKey]["three_year"].stringValue
let fourYear = swiftyJSON["lenders"][selectedLenderKey]["four_year"].stringValue
let fiveYear = swiftyJSON["lenders"][selectedLenderKey]["five_year"].stringValue
print(lenderName)
print(oneYear)
print(twoYear)
print(threeYear)
print(fourYear)
print(fiveYear)
}
catch{
print("Error 2")
}
}
}
task.resume()
}// end function
You could create a model and return that model:
struct Rates {
let lenderName: String?
let oneYear: String?
let twoYear: String?
let threeYear: String?
let fourYear: String?
let fiveYear: String?
required init() {
lenderName = nil
oneYear = nil
twoYear = nil
threeYear = nil
fourYear = nil
fiveYear = nil
}
init(lenderName: String?, oneYear: String?, twoYear: String?, threeYear: String?, fourYear: String?, fiveYear: String?) {
self.lenderName = lenderName
self.oneYear = oneYear
self.twoYear = twoYear
self.threeYear = threeYear
self.fourYear = fourYear
self.fiveYear = fiveYear
}
}
Then return the model you created:
func getLenderData(selectedLenderKey: String, onCompletion: @escaping (Rates?) -> Void, onError: @escaping (NSError) -> Void) {
let url = ""
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print("Error")
}
else{
do{
//let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
//print(fecthdata)
let swiftyJSON = try JSON(data:data!)
let lenderName = swiftyJSON["lenders"][selectedLenderKey]["financial_institution"].stringValue
let oneYear = swiftyJSON["lenders"][selectedLenderKey]["one_year"].stringValue
let twoYear = swiftyJSON["lenders"][selectedLenderKey]["two_year"].stringValue
let threeYear = swiftyJSON["lenders"][selectedLenderKey]["three_year"].stringValue
let fourYear = swiftyJSON["lenders"][selectedLenderKey]["four_year"].stringValue
let fiveYear = swiftyJSON["lenders"][selectedLenderKey]["five_year"].stringValue
print(lenderName)
print(oneYear)
print(twoYear)
print(threeYear)
print(fourYear)
print(fiveYear)
let rate = Rates(lenderName: lenderName, oneYear: oneYear, twoYear: twoYear, threeYear: threeYear, fourYear: fourYear, fiveYear: fiveYear)
onCompletion(rate)
}
catch{
print("Error 2")
onError(NSError(domain: "Some error description...", code: 0, userInfo: nil))
}
}
}
task.resume()
}// end function
Now you can just use the return value
as you want. To use it use the following code:
getLenderData(selectedLenderKey: "someVal", onCompletion: { (rate) in
// you can use the rate here
let oneYear = rate.oneYear
}, onError: { (error) in
// Error
})
You probably want to use Promise
for this sort of implementation. Look into PromiseKit . Your code would become something like this
func getLenderData(selectedLenderKey: String) -> Promise<String> {
return Promise { fulfill, reject in
let url = ""
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print("Error")
reject({ERROR})
}
else{
do{
//let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
//print(fecthdata)
let swiftyJSON = try JSON(data:data!)
let lenderName = swiftyJSON["lenders"][selectedLenderKey]["financial_institution"].stringValue
let oneYear = swiftyJSON["lenders"][selectedLenderKey]["one_year"].stringValue
let twoYear = swiftyJSON["lenders"][selectedLenderKey]["two_year"].stringValue
let threeYear = swiftyJSON["lenders"][selectedLenderKey]["three_year"].stringValue
let fourYear = swiftyJSON["lenders"][selectedLenderKey]["four_year"].stringValue
let fiveYear = swiftyJSON["lenders"][selectedLenderKey]["five_year"].stringValue
print(lenderName)
print(oneYear)
print(twoYear)
print(threeYear)
print(fourYear)
print(fiveYear)
fulfill({STRING})
}
catch{
print("Error 2")
reject({ERROR})
}
}
}
task.resume()
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.