Swift 使用错误枚举的关联值和计算属性

Swift 使用错误枚举的关联值和计算属性,swift,error-handling,enums,try-catch,Swift,Error Handling,Enums,Try Catch,我的错误是这样写的: public enum ParseError: LocalizedError { case badURL(_ urlString: String) public var errorDescription: String? { switch self { case .badURL: return String.invalidURL } } } 因为我只有一个案例,所以我不想在调

我的错误是这样写的:

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)

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

我能想到的唯一方法是向错误类型添加
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)
}

实际上,对于这种情况,捕捉语法时会出现错误。 我采用了这个代码,所以它可以在操场上运行

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 block的另一个变体:

} 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
}