Swift 模式匹配 - 单个语句中的转换、向下转换和可选绑定
Swift Pattern Matching - Switch, downcasting, and optional binding in a single statement
有没有办法合并下面的 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
消除重复并选择性地绑定 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
:[=18 的可选绑定=]
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
语句以包含可选绑定?
一些背景语境...
首先这是我的结果类型:
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
消除重复并选择性地绑定 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
:[=18 的可选绑定=]
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))
}