0
在我的应用程序的网络类中,我遵循典型的闭包模型,其中将结果传递给完成闭包。任何方式让枚举持有一个通用对象,并访问它以后没有类型转换?
class func login(username: String, password: String, completion: @escaping (Result) -> Void){
...
let user = makeUserWithSomeData()
completion(Result.Success(user))
}
结果可以是成功,其中包括我希望返回的任何数据,以及包含错误消息的失败。
enum Result {
case Success(Any)
case Failure(String)
}
调用看起来是这样的:
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
声明施放。如果成功发回字典,这会变得有点难看,而且不是非常灵活(如果稍后有人更改密钥,该怎么办?)。有没有办法让成功传回的价值变得更聪明一些,并记住分配给它的类型?
那么,为什么不将'Result'改为'T'类型的泛型,并且'Success'的case值有一个类型为'T'的相关值而不是'Any'。 – Alexander