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)