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 模式匹配 - 在单个语句中切换、向下转换和可选绑定的主要内容,如果未能解决你的问题,请参考以下文章

选项的保护语句在 swift 中为零

Swift中as as! as?的区别

如何在 Swift 的单个打印语句中打印多个对象?

[转]Swift编程风格指南

更新以在单个语句中切换布尔列

使用单个按钮 Xcode 或 swift 切换视图控制器的背景颜色