Swift: 如何通过引用函数传递对象数组
Swift: How to pass array of objects by reference to a function
我有一个自定义对象的列表,我想通过将它传递给函数来更改它的值:
我的代码如下:
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
}
我调用我的函数如下:
var mostRecent = [Item]()
UpdateButtonPressed(_Url:PublicVariables.GetMostRecent(), referenceArray: &mostRecent)
但是没有用,我该怎么做?
你可以试试补全
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()
}
像这样打电话
UpdateButtonPressed("") { (items) in
}
问题的开始是您正在使用 anti-pattern。
您应该努力使您的功能成为第一级功能(输入和输出)。
您可以通过使用完成块或诸如光明的未来或 rx swift 之类的东西来解决此问题。无论如何,你需要去掉 inout 参数。
看看这个链接:
https://thatthinginswift.com/completion-handlers/
我有一个自定义对象的列表,我想通过将它传递给函数来更改它的值: 我的代码如下:
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
}
我调用我的函数如下:
var mostRecent = [Item]()
UpdateButtonPressed(_Url:PublicVariables.GetMostRecent(), referenceArray: &mostRecent)
但是没有用,我该怎么做?
你可以试试补全
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()
}
像这样打电话
UpdateButtonPressed("") { (items) in
}
问题的开始是您正在使用 anti-pattern。 您应该努力使您的功能成为第一级功能(输入和输出)。 您可以通过使用完成块或诸如光明的未来或 rx swift 之类的东西来解决此问题。无论如何,你需要去掉 inout 参数。
看看这个链接:
https://thatthinginswift.com/completion-handlers/