我想知道如何解决这样的问题:
我有一个允许用户使用用户名和密码登录的应用程序。然后,应用程序将凭据发送到API服务器,并作为响应获取记录的用户数据
在我的模型中,我定义了一个User类
class User {
var id: String
var firstName: String?
var lastName: String?
var email: String
var permissions: String?
var birthday: String?
var subscription: String?
init(id: String, firstName: String?, lastName: String?, email: String, permissions: String?, birthday: String?, subscription: String?) {
self.id = id
self.firstName = firstName
self.lastName = lastName
self.email = email
self.permissions = permissions
self.birthday = birthday
self.subscription = subscription
}
然后,在一个名为ApiConnector的类中,我有类似以下内容(使用AFNetworking):
func loginUser(mainAddress: String, additionalAddr: String, email: String, password: String, callback: (success: Bool, data: User) -> Void){
let fullAddress = mainAddress + additionalAddr
var parameters = ["email":email, "password":password]
manager.POST( fullAddress,
parameters: parameters,
success: { (operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in
let json = JSON(data: operation.responseData)
//HERE I HAVE A JSON WITH USER DATA
callback(success: true, data: ???)
},
failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in
let json = JSON(data: operation.responseData)
//HERE I HAVE A JSON WITH ERROR
callback(success: false, data: ???)
})
}
现在,如您所见,我在数据字段中有一个返回User的回调。但是,当发生错误时,我应该返回一些ErrorType,而不是User,这是一个问题。
我在想如何统一响应,以便创建类似
enum Result<T, E> {
case Ok(T)
case Error(E)
}
并在确定的情况下返回我的User对象。如果发生错误,请返回我的ErrorType对象-但是有点无法解决。
谁能解释我在我的情况下如何做一个统一的响应类型?
(我在代码中放置了问号而不是类型,原因就是问题所在,而我没有解决方案的ATM)
我会选择Optional并与装饰好的NSError交换成功以获取不错的错误消息。例如这样的例子:
class User {}
class ServerResponseError {
var error: NSError
var message: String {
get {
switch(error.code) {
case 500:
return "server error"
default:
return "unknown error"
}
}
}
init(error: NSError) {
self.error = error
}
}
func loginUser(callback: (user: User?, error: ServerResponseError?) -> Void){
// something went wrong on server
var error: NSError = NSError(domain: "", code: 500, userInfo: nil)
callback(user: nil, error: ServerResponseError(error:error))
}
loginUser { (user, error) -> Void in
print(error.message)
}
您还可以修饰将从服务器返回的错误对象,并以相同的方式(通过用户nil)将其传递。但是我认为返回200和错误对象是一种不好的做法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句