Swift 2.0 try? 的替代方法
但你可以试着写出 enum Result<T> { case Value(T) case Error(ErrorType) } 就像上面的代码写的那样,我喜欢分成 func tryit<T>(block: () throws -> T) -> Result<T> { do { let value = try block() return Result.Value(value) } catch {return Result.Error(error)} } 实际上我也不太喜欢 tryit 这个名字,你用你喜欢的名字代替就好。这个函数的调用有点啰嗦了,不是我们想要的这样: let result = try myFailableCoinToss() 而是这种: let result = tryit(myFailableCoinToss) 一位名叫 glessard 的读者提供给我了另一种替代方式,建议我给 Result 添加一个初始化方法而不是用 tryit: enum Result<T> { case Value(T) case Error(ErrorType) init(_ block: () throws -> T) { do { let value = try block() self = Result.Value(value) } catch { self = Result.Error(error) } } } 然后你直接这么调用就行了: let result = Result(myFailableCoinToss) 如果你要用 let result = tryit(myFailableCoinToss) switch result { case .Value(let value): print("Success:",value) case .Error(let error): print("Failure:",error) } 或者直接用模式匹配: if case .Value(let value) = result { print("Success:",value) } else if case .Error(let error) = result { print("Failure:",error) } 你也可以添加一些退出作用域的代码来模仿 enum Result<T> { case Value(T) case Error(ErrorType) func unwrap() throws -> T { if case .Value(let value) = self {return value} throw "Unable to unwrap result" } func handleError(errorHandler: ErrorType -> Void) -> Bool { if case .Error(let error) = self { errorHandler(error) return true } return false } } func tryit<T>(block: () throws -> T) -> Result<T> { do { let value = try block() return Result.Value(value) } catch {return Result.Error(error)} } let result = tryit(myFailableCoinToss) // guard error if result.handleError({ error in print("Error is (error)") }) {fatalError()} // leave scope on true // force try for success case let unwrappedResult = try! result.unwrap() // result is now usable at top level scope print("Result is (unwrappedResult)") 这还有另外一种更像 func tryit<T>(block: () throws -> T) -> Optional<T>{ do { return try block() } catch { print(error) return nil } } 第二种替代 let result = tryit(myFailableCoinToss) 你仍然不能基于错误类型和错误细节来制定错误处理策略,但是这种实现方式也不像 你也可以修改 tryit 函数,让它也能接受做错误处理的代码块,但因为要处理两种不同的代码块,这个函数就会变得相当臃肿。我尝试过几种不同的实现方式,但都做的不太好,就不在这分享出来了。最大的问题是,就算你把做错误处理的代码块传给 tryit 了,你也不能像 我觉得我最后实现的应该类似于下面的这种形式,在顶层作用域中执行条件赋值,并采用 guard let result = try!! myFailableCoinToss() else {error in ...} 之所以这么做是因为我们想知道我们的程序到底会不会出错,如果不出错的话,直接就能得到返回值了。 let result = try myFailableCoinToss() 如果要用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |