在Swift 3中将数据转换为字符串

Ily*_*kov 23 string type-conversion swift3

我对Swift很新.

我想为我的教育应用程序在Swift上创建类似API的东西.

我有这个代码:

    static func getFilm(filmID: Int) -> String {

    print("getFilm")

    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!
    var request = URLRequest(url: url)

    var returnData: String = ""

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if var responseVar = response, var dataVar = data {
            print(responseVar)
            returnData = String(data: dataVar, encoding: .utf8)
        } else {
            print(error)
        }
    }

    task.resume()

    return returnData
}
Run Code Online (Sandbox Code Playgroud)

我尝试在此行中将数据转换为字符串: returnData = String(data: dataVar, encoding: .utf8)

Swift编译器给我一个错误,并将此行更改为 returnData = String(data: dataVar, encoding: .utf8)! ,当我执行此行时,我得到空的returnData变量.

如果我使用基本的示例行, print(String(data: data, encoding: .utf8)) 一切都会好的,我可以data在XCode控制台中看到.

那么,我如何将数据转换为字符串?

vad*_*ian 36

这是一个使用完成处理程序的示例:

class func getFilm(filmID: Int, completion: @escaping (String) -> ()) {
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!

    URLSession.shared.dataTask(with:url) { (data, response, error) in
      if error != nil {
        print(error!)
        completion("")
      } else {
        if let returnData = String(data: data!, encoding: .utf8) {
          completion(returnData)
        } else {
          completion("")
        }
      }
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)

你打电话给它

MyClass.getFilm(filmID:12345) { result in
   print(result)
}
Run Code Online (Sandbox Code Playgroud)

如果出现错误,则完成处理程序返回一个空字符串.

MyClass是封闭的getFilm方法类.Web服务很可能会返回JSON,因此您可能需要将JSON反序列化为数组或字典.


在更复杂的版本中,创建包含两个案例和关联值的枚举

enum ConnectionResult {
  case success(String), failure(Error)
}
Run Code Online (Sandbox Code Playgroud)

通过稍微努力演示Swift的微妙功能,您可以在单个对象中失败时成功返回转换后的字符串.

class func getFilm(filmID: Int, completion: @escaping (ConnectionResult) -> ()) {
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!

    URLSession.shared.dataTask(with:url) { (data, response, error) in
      if error != nil {
        completion(.failure(error!))
      } else {
        if let returnData = String(data: data!, encoding: .utf8) {
          completion(.success(returnData))
        } else {
          completion(.failure(NSError(domain: "myDomain", code: 9999, userInfo: [NSLocalizedDescriptionKey : "The data is not converible to 'String'"])))
        }
      }
    }.resume()
}
Run Code Online (Sandbox Code Playgroud)

在调用者方面,switch语句将案例分开.

MyClass.getFilm(filmID:12345) { result in
    switch result {
    case .success(let string) : print(string)
    case .failure(let error) : print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)