Search code examples
swiftfunctionprocedure

Swift: How to pass array of objects by reference to a function


I have a list of a custom object that I want to change it's value by passing it to a function: My code below:

func UpdateButtonPressed(_Url : String,referenceArray: inout Array<Item>)
{

    var _itemList = [Item]()
    var result:String! = ""
    let url = URL(string:_Url)
    var request = URLRequest(url: url! as URL)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
        guard data != nil else {
            print("no data found: \(error)")
            return }
        do {
            let temp = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            result = String(describing: temp!)
            DispatchQueue.main.async {
               referenceArray.append(contentsOf:  self.UpdateItem(result:result))
            }
        }
    })
    task.resume()
}

func UpdateItem(result:String)-> [Item]
{
    var _itemList = [Item]()
    _itemList = Item.ConvertJSONToItemList(result: result)
    return _itemList
}

and I call my function as below:

 var mostRecent = [Item]()
       UpdateButtonPressed(_Url:PublicVariables.GetMostRecent(), referenceArray: &mostRecent)

But it's not worked, How can I do that?


Solution

  • You can try completions

          func UpdateButtonPressed(_ Url : String , completion: @escaping (_ arr: [Item]) -> Void)       
          {
    
            var _itemList = [Item]()
            var result:String! = ""
            let url = URL(string:_Url)
            var request = URLRequest(url: url! as URL)
            request.httpMethod = "POST"
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.addValue("application/json", forHTTPHeaderField: "Accept")
    
            let session = URLSession.shared
            let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
                guard data != nil else {
                    print("no data found: \(error)")
                    return }
                do {
                    let temp = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
                    result = String(describing: temp!)
                    DispatchQueue.main.async {
    
                        completion(self.UpdateItem(result:result))
    
                    }
                }
            })
            task.resume()
    
     }
    

    call like this

        UpdateButtonPressed("") { (items) in
    
        }