2017-07-03 53 views
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声明施放。如果成功发回字典,这会变得有点难看,而且不是非常灵活(如果稍后有人更改密钥,该怎么办?)。有没有办法让成功传回的价值变得更聪明一些,并记住分配给它的类型?

+0

那么,为什么不将'Result'改为'T'类型的泛型,并且'Success'的case值有一个类型为'T'的相关值而不是'Any'。 – Alexander

回答

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; 
    } 
} 

顺便说形成夫特3.1 lowerCamelCase用于枚举是优选的。

相关问题