Swift 模式匹配 - 在单个语句中切换、向下转换和可选绑定
Posted
技术标签:
【中文标题】Swift 模式匹配 - 在单个语句中切换、向下转换和可选绑定【英文标题】:Swift Pattern Matching - Switch, downcasting, and optional binding in a single statement 【发布时间】:2018-07-08 20:47:12 【问题描述】:有没有办法合并下面的switch
语句以包含可选绑定?
一点背景背景...
首先这是我的结果类型:
enum Result<Value>
case success(Value)
case failure(Swift.Error)
Facebook 的 SDK 扩展:
func start(_ completionHandler: @escaping (Result<Any>) -> Void) -> FBSDKGraphRequestConnection
return start() (_, response, error) in
switch (response, error)
case (.some(let result), .none):
completionHandler(Result(value: result))
case (.none, .some(let error)):
completionHandler(Result(error: error))
case (.none, .none), (.some, .some):
preconditionFailure("Unexpected State")
最后,我要重构的那段代码。我的目标是避免重复的self.present(error:)
代码:
_ = FBSDKGraphRequest.emailRequest().start() (result: Result<Any>) in
switch result
case .success (let value as [ String : Any ]):
...
if let email = value["email"] as? String
...
else
self.present(error: Error(.facebookOther))
default:
self.present(error: Error(.facebookOther))
【问题讨论】:
不完全在那里。这消除了重复,但它没有为您提供可选绑定:switch result case .success (let value as [ String : Any ]) where value["email"] is String: print("email: \(value["email"]!)") default: self.present(error: Error(.facebookOther))
您能否详细说明您要避免哪些重复?是email
的可选绑定吗?
【参考方案1】:
我不确定您是否可以使用switch
消除重复并可选择绑定email
,但您可以使用if
:
if case .success(let value as [String : Any]) = result, let email = value["email"] as? String
print("email: \(email)")
else
self.present(error: Error(.facebookOther))
使用switch
可以做的最好的事情是通过添加where
子句来避免重复,但是您会错过email
的可选绑定:
switch result
case .success (let value as [ String : Any ]) where value["email"] is String:
let email = value["email"] as! String
print("email: \(email)")
default:
self.present(error: Error(.facebookOther))
【讨论】:
这是要走的路。谢谢你。我的大脑无法看到switch
声明!以上是关于Swift 模式匹配 - 在单个语句中切换、向下转换和可选绑定的主要内容,如果未能解决你的问题,请参考以下文章