【问题标题】:Use both associated value and computed property of error enum使用错误枚举的关联值和计算属性
【发布时间】:2019-12-22 08:06:51
【问题描述】:

我的错误是这样写的:

public enum ParseError: LocalizedError {
    case badURL(_ urlString: String)

    public var errorDescription: String? {
        switch self {
        case .badURL:
            return String.invalidURL
        }
    }
}

由于我只有一种情况,我不在乎在调用代码中创建多个模式:

    do {
        let url = try urlString.constructURL()
        UIApplication.shared.open(url)
    } catch {
        Alert().showError(error.errorDescription, subTitle: urlString) // trying to get the associated value here
    }

我想做这样的事情:

catch let error = error as ParseError(let urlString)

但显然,这是不可能的。如何在语句中获取枚举本身的值及其关联值?

【问题讨论】:

    标签: swift error-handling enums try-catch


    【解决方案1】:

    我能想到的唯一方法是在错误类型中添加一个urlString 属性,

    extension ParseError {
        var urlString: String? {
            switch self {
            case .badURL(let x): return x
            }
        }
    }
    

    然后像这样捕获错误:

    do {
        let url = try urlString.constructURL()
        UIApplication.shared.open(url)
    } catch let error as ParseError {
        Alert().showError(error.errorDescription, subTitle: error.urlString)
    }
    

    【讨论】:

      【解决方案2】:

      实际上,对于这种情况,有一个错误捕获语法。 我采用了代码,所以它可以在 Playground 中运行。

      import UIKit
      import Foundation
      public enum ParseError: LocalizedError {
          case badURL(_ urlString: String)
      
          public var errorDescription: String? {
              switch self {
              case .badURL:
                  return "invalidURL"
              }
          }
      }
      
      let strForURL = "www.swift.org"
      do {
          if let url = URL(string: strForURL) {
              UIApplication.shared.open(url)
              // Temporaly line used to fire error
              throw ParseError.badURL(strForURL) // FIXME: - remove in production
          }
          else {
              throw ParseError.badURL(strForURL)
          }
      } catch ParseError.badURL(let badURLString) {
      
              print("Alert \(ParseError.badURL("").errorDescription ?? "") \(badURLString)")
          //Alert().showError(error.errorDescription, subTitle: urlString) // FIXME: - show alerts you want
      }
      

      如果您也需要 error 本身,这里是 catch 块的另一种变体:

      } catch let error as ParseError {
          if case .badURL(let badURLString) = error {
              print("Alert \(error.errorDescription) \(badURLString)")
          }
          //Alert().showError(error.errorDescription, subTitle: urlString) // FIXME: - show alerts you want
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        相关资源
        最近更新 更多