有什么方法可以让enum持有一个通用对象并在以后没有类型转换的情况下访问它?

时间:2017-07-03 03:35:57

标签: ios swift

在我的应用程序的网络类中,我遵循典型的闭包模型,在该模型中将结果传递给完成闭包。

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发送回字典,这会变得有点难看,并且不是很灵活(如果有人稍后更改密钥怎么办?)。是否有任何方法可以让成功传递的价值变得更聪明并记住分配给它的类型?

1 个答案:

答案 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是首选。