完成处理程序 swift 3 return 来自函数的变量
Completion handler swift 3 return a variable from function
我对 swift 3.
中完成处理程序的语法感到困惑
在下面的函数中,在从 Web 服务调用解析 xml
文件后,它应该 return 一个变量(一个 array [String:String]
)。
下面是我的尝试,但显然是不正确的。
enum HistoryKey {
case success([String:String])
case failure(String)
}
private func getHistoryKeys(searchterm: String, completion: @escaping () -> HistoryKey) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
}
task.resume()
if keys.isEmpty {
return .failure("no historyKeyDictionary")
}else{
return .success(keys)
}
}// End of func
我想按如下方式使用这个功能
let result = self.getHistoryKeys(searchTerm)
据我所知,应该是
private func getHistoryKeys(searchterm: String, completion: @escaping (HistoryKey) -> ())
还应使用 completion(.failure("no historyKeyDictionary"))
或 completion(.success(keys))
而不是 return
enum HistoryKey {
case success([String: String])
case failure(String)
}
private func getHistoryKeys(searchterm: String, completion: @escaping (_ result: HistoryKey) -> Void) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
if keys.isEmpty {
completion(.failure("no historyKeyDictionary"))
} else {
completion(.success(keys))
}
}
task.resume()
} // End of func
类似的东西。更改 @escaping
声明并完成而不是 return.
希望对您有所帮助。
您没有使用 completion
块。
像这样使用它:
private func getHistoryKeys(searchterm: String, completion: @escaping (_ keys: Array) -> Void) {
//do the magic
completion(keys)
}
那么你可以这样调用这个函数:
getHistoryKeys(searchterm: "str") { (keys) in
print("\(keys)")
}
两个问题:
- 完成处理程序传递一个
HistoryKey
实例并且没有 return 值,因此签名必须相反。
- 完成处理程序的调用必须在数据任务的完成块中。
能够在完成块外解析接收到的数据return data
成功
enum ConnectionResult {
case success(Data)
case failure(Error)
}
private func getHistoryKeys(searchterm: String, completion: @escaping (ConnectionResult) -> ()) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let task = session.dataTask(with: url) { (data, response, error) in
if let error = error {
completion(.failure(error))
} else {
completion(.success(data!))
}
}
task.resume()
}
并称之为
getHistoryKeys(searchterm: String) { connectionResult in
switch connectionResult {
case .success(let data):
let myParser = XMLParser(data: data)
myParser.delegate = self
myParser.parse()
// get the parsed data from the delegate methods
case .failure(let error): print(error)
}
}
Return 结果作为完成处理程序中的参数:
private func getHistoryKeys(searchterm: String, completion: @escaping (result: HistoryKey) -> Void) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
//DispatchQueue.main.async { // if you want to do UI stuff dispatch calls to completion() on the main queue
if keys.isEmpty {
completion(.failure("no historyKeyDictionary"))
} else{
completion(.success(keys))
}
//}
}
task.resume()
}
并这样称呼它:
getHistoryKeys("searchMe") { (result: HistoryKey) in
print(result)
}
Swift 4.2
enum HistoryKey {
case success([String:String])
case failure(String)
}
func myFunction(str: String, completionHandler: @escaping (HistoryKey) -> ()){
completion(.success([String:String]))
//OR
completion(.failure(""))
}
myFunction(str: String) { result in
switch result {
case .success(let data): break;
case .failure(let error): break;
}
}
或
func myFunction(str: String, completionHandler: @escaping (String) -> ()){
completionHandler("")
}
myFunction(str: "someThing", completionHandler: {(str) in
})
我对 swift 3.
中完成处理程序的语法感到困惑在下面的函数中,在从 Web 服务调用解析 xml
文件后,它应该 return 一个变量(一个 array [String:String]
)。
下面是我的尝试,但显然是不正确的。
enum HistoryKey {
case success([String:String])
case failure(String)
}
private func getHistoryKeys(searchterm: String, completion: @escaping () -> HistoryKey) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
}
task.resume()
if keys.isEmpty {
return .failure("no historyKeyDictionary")
}else{
return .success(keys)
}
}// End of func
我想按如下方式使用这个功能
let result = self.getHistoryKeys(searchTerm)
据我所知,应该是
private func getHistoryKeys(searchterm: String, completion: @escaping (HistoryKey) -> ())
还应使用 completion(.failure("no historyKeyDictionary"))
或 completion(.success(keys))
而不是 return
enum HistoryKey {
case success([String: String])
case failure(String)
}
private func getHistoryKeys(searchterm: String, completion: @escaping (_ result: HistoryKey) -> Void) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
if keys.isEmpty {
completion(.failure("no historyKeyDictionary"))
} else {
completion(.success(keys))
}
}
task.resume()
} // End of func
类似的东西。更改 @escaping
声明并完成而不是 return.
希望对您有所帮助。
您没有使用 completion
块。
像这样使用它:
private func getHistoryKeys(searchterm: String, completion: @escaping (_ keys: Array) -> Void) {
//do the magic
completion(keys)
}
那么你可以这样调用这个函数:
getHistoryKeys(searchterm: "str") { (keys) in
print("\(keys)")
}
两个问题:
- 完成处理程序传递一个
HistoryKey
实例并且没有 return 值,因此签名必须相反。 - 完成处理程序的调用必须在数据任务的完成块中。
能够在完成块外解析接收到的数据return data
成功
enum ConnectionResult {
case success(Data)
case failure(Error)
}
private func getHistoryKeys(searchterm: String, completion: @escaping (ConnectionResult) -> ()) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let task = session.dataTask(with: url) { (data, response, error) in
if let error = error {
completion(.failure(error))
} else {
completion(.success(data!))
}
}
task.resume()
}
并称之为
getHistoryKeys(searchterm: String) { connectionResult in
switch connectionResult {
case .success(let data):
let myParser = XMLParser(data: data)
myParser.delegate = self
myParser.parse()
// get the parsed data from the delegate methods
case .failure(let error): print(error)
}
}
Return 结果作为完成处理程序中的参数:
private func getHistoryKeys(searchterm: String, completion: @escaping (result: HistoryKey) -> Void) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
//DispatchQueue.main.async { // if you want to do UI stuff dispatch calls to completion() on the main queue
if keys.isEmpty {
completion(.failure("no historyKeyDictionary"))
} else{
completion(.success(keys))
}
//}
}
task.resume()
}
并这样称呼它:
getHistoryKeys("searchMe") { (result: HistoryKey) in
print(result)
}
Swift 4.2
enum HistoryKey {
case success([String:String])
case failure(String)
}
func myFunction(str: String, completionHandler: @escaping (HistoryKey) -> ()){
completion(.success([String:String]))
//OR
completion(.failure(""))
}
myFunction(str: String) { result in
switch result {
case .success(let data): break;
case .failure(let error): break;
}
}
或
func myFunction(str: String, completionHandler: @escaping (String) -> ()){
completionHandler("")
}
myFunction(str: "someThing", completionHandler: {(str) in
})