Rik*_*ikh 71 ios nsurlsession swift3
我想要实现的是URLSession
在swift 3中执行请求.我在一个单独的函数中执行此操作(以便不为GET和POST单独编写代码)并返回URLSessionDataTask
并处理闭包中的成功和失败.有点像这样 -
let task = URLSession.shared.dataTask(with: request) { (data, uRLResponse, responseError) in
DispatchQueue.main.async {
var httpResponse = uRLResponse as! HTTPURLResponse
if responseError != nil && httpResponse.statusCode == 200{
successHandler(data!)
}else{
if(responseError == nil){
//Trying to achieve something like below 2 lines
//Following line throws an error soo its not possible
//var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil)
//failureHandler(errorTemp)
}else{
failureHandler(responseError!)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望处理此函数中的错误条件,并希望使用响应代码生成错误,并返回此错误以在任何调用此函数的位置处理它.任何人都可以告诉我该怎么做?或者这不是处理这种情况的"快速"方式吗?
Luc*_*rti 91
在您的情况下,错误是您正在尝试生成Error
实例.Error
在Swift 3中是一种可用于定义自定义错误的协议.此功能特别适用于在不同操作系统上运行的纯Swift应用程序.
在iOS开发中,NSError
该类仍然可用,并且它符合Error
协议.
因此,如果您的目的只是传播此错误代码,则可以轻松替换
var errorTemp = Error(domain:"", code:httpResponse.statusCode, userInfo:nil)
Run Code Online (Sandbox Code Playgroud)
同
var errorTemp = NSError(domain:"", code:httpResponse.statusCode, userInfo:nil)
Run Code Online (Sandbox Code Playgroud)
否则,请检查Sandeep Bhandari关于如何创建自定义错误类型的答案
Har*_*oom 61
您可以LocalizedError
使用以下值创建符合Swift 协议的协议:
protocol OurErrorProtocol: LocalizedError {
var title: String? { get }
var code: Int { get }
}
Run Code Online (Sandbox Code Playgroud)
这使我们能够创建具体的错误:
struct CustomError: OurErrorProtocol {
var title: String?
var code: Int
var errorDescription: String? { return _description }
var failureReason: String? { return _description }
private var _description: String
init(title: String?, description: String, code: Int) {
self.title = title ?? "Error"
self._description = description
self.code = code
}
}
Run Code Online (Sandbox Code Playgroud)
San*_*ari 42
你可以创建枚举来处理错误:)
enum RikhError: Error {
case unknownError
case connectionError
case invalidCredentials
case invalidRequest
case notFound
case invalidResponse
case serverError
case serverUnavailable
case timeOut
case unsuppotedURL
}
Run Code Online (Sandbox Code Playgroud)
然后在enum中创建一个方法来接收http响应代码并返回相应的错误:)
static func checkErrorCode(_ errorCode: Int) -> RikhError {
switch errorCode {
case 400:
return .invalidRequest
case 401:
return .invalidCredentials
case 404:
return .notFound
//bla bla bla
default:
return .unknownError
}
}
Run Code Online (Sandbox Code Playgroud)
最后更新你的故障块以接受RikhError类型的单个参数:)
我有一个详细的教程,关于如何使用Swift3将传统的基于Objective-C的面向对象的网络模型重构为现代的面向协议的模型https://learnwithmehere.blogspot.in看看:)
希望能帮助到你 :)
Ahm*_*tfy 32
您应该使用NSError对象.
let error = NSError(domain:"", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invalid access token"])
然后将NSError转换为Error对象
pre*_*ett 14
实现LocalizedError:
struct StringError : LocalizedError
{
var errorDescription: String? { return mMsg }
var failureReason: String? { return mMsg }
var recoverySuggestion: String? { return "" }
var helpAnchor: String? { return "" }
private var mMsg : String
init(_ description: String)
{
mMsg = description
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,简单地实现Error,例如,如其中一个答案中所述,将失败(至少在Swift 3中),并且调用localizedDescription将导致字符串"操作无法完成.(.Stringtring error 1) "
let error = NSError(domain:"", code:401, userInfo:[ NSLocalizedDescriptionKey: "Invaild UserName or Password"]) as Error
self.showLoginError(error)
Run Code Online (Sandbox Code Playgroud)
创建一个 NSError 对象并将其类型转换为 Error ,在任何地方显示它
private func showLoginError(_ error: Error?) {
if let errorObj = error {
UIAlertController.alert("Login Error", message: errorObj.localizedDescription).action("OK").presentOn(self)
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然认为哈利的答案是最简单和完整的,但如果您需要更简单的东西,请使用:
struct AppError {
let message: String
init(message: String) {
self.message = message
}
}
extension AppError: LocalizedError {
var errorDescription: String? { return message }
// var failureReason: String? { get }
// var recoverySuggestion: String? { get }
// var helpAnchor: String? { get }
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用或测试它:
printError(error: AppError(message: "My App Error!!!"))
func print(error: Error) {
print("We have an ERROR: ", error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)
import Foundation
enum AppError {
case network(type: Enums.NetworkError)
case file(type: Enums.FileError)
case custom(errorDescription: String?)
class Enums { }
}
extension AppError: LocalizedError {
var errorDescription: String? {
switch self {
case .network(let type): return type.localizedDescription
case .file(let type): return type.localizedDescription
case .custom(let errorDescription): return errorDescription
}
}
}
// MARK: - Network Errors
extension AppError.Enums {
enum NetworkError {
case parsing
case notFound
case custom(errorCode: Int?, errorDescription: String?)
}
}
extension AppError.Enums.NetworkError: LocalizedError {
var errorDescription: String? {
switch self {
case .parsing: return "Parsing error"
case .notFound: return "URL Not Found"
case .custom(_, let errorDescription): return errorDescription
}
}
var errorCode: Int? {
switch self {
case .parsing: return nil
case .notFound: return 404
case .custom(let errorCode, _): return errorCode
}
}
}
// MARK: - FIle Errors
extension AppError.Enums {
enum FileError {
case read(path: String)
case write(path: String, value: Any)
case custom(errorDescription: String?)
}
}
extension AppError.Enums.FileError: LocalizedError {
var errorDescription: String? {
switch self {
case .read(let path): return "Could not read file from \"\(path)\""
case .write(let path, let value): return "Could not write value \"\(value)\" file from \"\(path)\""
case .custom(let errorDescription): return errorDescription
}
}
}
Run Code Online (Sandbox Code Playgroud)
//let err: Error = NSError(domain:"", code: 401, userInfo: [NSLocalizedDescriptionKey: "Invaild UserName or Password"])
let err: Error = AppError.network(type: .custom(errorCode: 400, errorDescription: "Bad request"))
switch err {
case is AppError:
switch err as! AppError {
case .network(let type): print("Network ERROR: code \(type.errorCode), description: \(type.localizedDescription)")
case .file(let type):
switch type {
case .read: print("FILE Reading ERROR")
case .write: print("FILE Writing ERROR")
case .custom: print("FILE ERROR")
}
case .custom: print("Custom ERROR")
}
default: print(err)
}
Run Code Online (Sandbox Code Playgroud)
protocol CustomError : Error {
var localizedTitle: String
var localizedDescription: String
}
enum RequestError : Int, CustomError {
case badRequest = 400
case loginFailed = 401
case userDisabled = 403
case notFound = 404
case methodNotAllowed = 405
case serverError = 500
case noConnection = -1009
case timeOutError = -1001
}
func anything(errorCode: Int) -> CustomError? {
return RequestError(rawValue: errorCode)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70108 次 |
最近记录: |