【问题标题】:Error: Type of expression is ambiguous without more context错误:表达式类型不明确,没有更多上下文
【发布时间】:2022-11-18 04:58:04
【问题描述】:

我正在尝试使用 dataTask 从 API 函数返回一个值。编辑代码时,出现错误:“没有更多上下文,表达式类型不明确。”我在下面添加了代码和图片。有谁知道如何解决这一问题?我是斯威夫特的新手。

func getNonce() {
let headers = [
  "accept": "application/json",
  "content-type": "application/json"
]
let parameters = [
  "id": 1,
  "jsonrpc": "2.0",
  "params": [addressETH, "pending"],
  "method": "eth_getTransactionCount"
] as [String : Any]
let postData = try? JSONSerialization.data(withJSONObject: parameters, options: [])
let request = NSMutableURLRequest(url: NSURL(string: "https://eth-goerli.g.alchemy.com/v2/myapikeygoeshere")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData! as Data
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> String in
    if (error != nil) {
        print(error as Any)
    } else {
        let dataString = String(data: data!, encoding: .utf8)!
        let start = dataString.index(dataString.startIndex, offsetBy: 36)
        let end = dataString.index(dataString.endIndex, offsetBy: -2)
        let range = start..<end
        let user_Nonce = String(dataString[range])
        return user_Nonce?
    }
})
dataTask.resume() }

错误在这一行:

let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> String in

我试图返回值,但弹出错误。请帮忙

【问题讨论】:

  • 这里有很多问题,但是从你的图像错误开始......你使用的 URLSession 方法有一个 (Data?, URLResponse?, Error?) -&gt; Void 类型的完成处理程序,但你已经用 (Data?, URLResponse?, Error?) -&gt; String 替换了它,这不会工作。此外,你有时只在你的实现中返回一个String,所以你需要在你的第一个if分支中添加一个return nil,并且需要闭包然后是一个(Data?, URLResponse?, Error?) -&gt; String?,这仍然不会'不起作用,因为那不是该方法的签名所采用的。
  • 这个问题也是模棱两可的。将细节直接添加到问题中,而不是作为照片,以便人们更容易回答。

标签: swift


【解决方案1】:

您应该阅读完成处理程序或异步等待如何在 swift 中工作。以下是有关如何构造此函数以使其工作的一些示例 - 您必须在调用站点考虑完成处理程序或异步等待。

func getNonce(completion: @escaping (Result<String, Error>) -> Void) {
    // ... make your actual request instead of my example
    let request = URLRequest(url: URL(string: "https://www.example.com")!)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            completion(.failure(error))
            return
        }
        
        // ... your parsing data here
        completion(.success("the parsed nonce"))
    }
    task.resume()
}

func getNonce() async throws -> String {
    // ... make your actual request instead of my example
    let request = URLRequest(url: URL(string: "https://www.example.com")!)
    
    let (data, _) = try await URLSession.shared.data(for: request)
    
    // ... your parsing here
    return "the parsed nonce"
}

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多