gpt4 book ai didi

Swift 可以放入 `if let` block 吗?

转载 作者:行者123 更新时间:2023-11-28 10:44:56 25 4
gpt4 key购买 nike

编写了这个简单的 getJson 包装器:

func getJson<T>(path: String) -> T? {
let url = URL(string: path)
let session = URLSession.shared
var obj: T?
if let usableUrl = url {
let task = session.dataTask(with: usableUrl,
completionHandler: { (data, response, error) in // # <-- this line
if let data = data {
if let stringData = String(
data: data, encoding: String.Encoding.utf8) {
let decoder = JSONDecoder()
obj = try decoder.decode(T.self, from: json)
}
}
})
task.resume()
}
return obj
}

但是关于我的 completionHandler 我得到了这个错误:

Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'

相关说明,这是 3 层 if 语句,它们可以展平吗?

最佳答案

除了抛出问题外,您的代码还有很多问题。正如您所注意到的,许多嵌套的 if 使其难以阅读,但主要是,它在等待异步网络调用之前返回您的 obj 变量,因此不会产生您期望的结果。

下面是我将如何开始重写它。

func getJson<T: Decodable>(path: String, completion: @escaping (T?) -> () ) {
guard let url = URL(string: path) else {
return
}

let session = URLSession.shared
let task = session.dataTask(with: url) { (data, response, error) in
if let data = data {
do {
let obj = try JSONDecoder().decode(T.self, from: data)
completion(obj)
} catch {
completion(nil)
}
}
}
task.resume()
}

// usage example:

struct Foo: Decodable {
let bar: Int
}

getJson(path: "http://example.com") { (obj: Foo?) in
if let foo = obj {
// processs data
} else {
// an error occurred
}
}

关于Swift 可以放入 `if let` block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48851569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com