【问题标题】:How i can pass the data to a variable in swift4? [duplicate]我如何将数据传递给swift4中的变量? [复制]
【发布时间】:2018-09-14 15:22:01
【问题描述】:

我需要在另一个视图控制器中使用输出数据但我不能使用,字符串只返回一个空字符串:

func callApi(postString: String) -> (String) {
    var outputdata = String()
    var req = LogIn(postString: postString)
    let task = URLSession.shared.dataTask(with: req) { (data, response, error) in
        if let data = data{
            outputdata = String(data: data, encoding: String.Encoding.utf8)!
            //print(outputdata)


        }
    }

    print(outputdata)
    return (outputdata)
}

【问题讨论】:

  • 您确定请求不会失败吗?读取数据不是空字符串编码?
  • 你需要恢复任务才能得到结果.. 'task.resume()' 这是异步请求,所以你不能在这里使用return,而是使用闭包。
  • 您缺少的概念是“异步”。如果你用print("In the dataTask() closure: \(outputdata)") 代替//print(outputdata),用return 代替print(outputdata)(就在return 之前),你会发现打印的顺序不是你认为的那个。寻找“Swift + Closure + Async”来管理它。

标签: ios swift


【解决方案1】:

你可以试试这个,因为这个过程是异步的

func callApi(_ postString: String,completion:@escaping:(_ res:String?) -> Void ) {
     var req = LogIn(postString: postString)
    URLSession.shared.dataTask(with: req) { (data, response, error) in
        if let data = data{
            completion(String(data: data, encoding: String.Encoding.utf8))     
        }
        else {
            completion(nil)
        }
    }.resume()
 }

打电话

callApi("SendedValue") {  res in
  print(res)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 2015-07-04
    • 2020-02-02
    • 2018-04-06
    • 2020-11-27
    • 2015-03-21
    • 2017-02-28
    相关资源
    最近更新 更多