简体   繁体   English

快速函数返回多个值

[英]swift function return multiple values

Below is a function that I am trying to create that will get the values in JSON data based on the key value entered. 下面是我尝试创建的函数,该函数将根据输入的键值获取JSON数据中的值。 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". 此时,该函数给我一个错误-“期望返回字符串的函数中缺少Return”。 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. 现在,您可以根据需要使用return value 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. 您可能希望将Promise用于此类实现。 Look into PromiseKit . 调查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()
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM