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
}