在我的应用程序的网络类中,我遵循典型的闭包模型,在该模型中将结果传递给完成闭包。
enum Result {
case Success(Any)
case Failure(String)
}
结果可以是Success,其中包括我想要返回的任何数据,以及Failure,其中包含错误消息。
MyWebServices.login(username: username, password: password)
{ (result) in
switch(result)
{
case .Success(let value):
print("Success:\n\(value)")
if let user = value as? User {
useMyValue(user)
}
break
case .Failure(let error):
print("Error: \(error)")
break;
}
}
电话看起来像这样:
value
问题是if let
是Any类型,需要使用ejs
语句进行强制转换。如果Success发送回字典,这会变得有点难看,并且不是很灵活(如果有人稍后更改密钥怎么办?)。是否有任何方法可以让成功传递的价值变得更聪明并记住分配给它的类型?
答案 0 :(得分:3)
这个怎么样
enum Result<T> {
case success(T)
case failure(String)
}
这样的事情
class func login(username: String, password: String, completion: @escaping (Result<User>) -> Void){
//...
//let user = makeUserWithSomeData()
completion(Result.success(user))
}
现在你不必投了。
MyWebServices.login(username: username, password: password) {
(result) in
switch(result) {
case .success(let value):
useMyValue(user)
break
case .failure(let error):
print("Error: \(error)")
break;
}
}
顺便说一下Swift 3.1 lowerCamelCase for enums是首选。