"推奨されている"方法があるかどうかわかりませんが、おそらく他の人が に答えるか、より良い解決策を提供することができます。
しかし、一つ可能アプローチは、エラーの種類としてstruct
(特性を有する)を使用し、 設ける必要がない値のオプションのプロパティを使用することであろう。例:
struct ParserError: Error {
enum Reason {
case invalidCharacter
case unexpectedEOF
}
let reason: Reason
let line: Int?
let column: Int?
init(reason: Reason, line: Int? = nil, column: Int? = nil) {
self.reason = reason
self.line = line
self.column = column
}
}
一つも 具体的なエラーの種類がキャッチャーで知られていない場合でも は賢明なエラーの説明を提供するために、LocalizedError
プロトコルを採用する場合があります(How to provide a localized description with an Error type in Swift?を比較):
extension ParserError: LocalizedError {
public var errorDescription: String? {
var description: String
switch reason {
case .invalidCharacter:
description = "Invalid Character in input file"
case .unexpectedEOF:
description = "Unexpected end of file"
}
if let line = line {
description += ", line \(line)"
}
if let column = column {
description += ", column \(column)"
}
return description
}
}
使い方例:
func parse() throws {
// Throw error with line number, but without column:
throw ParserError(reason: .invalidCharacter, line: 13)
}
do {
try parse()
} catch let error {
print(error.localizedDescription)
}
出力:
Invalid Character in input file, line 13
私はあなたの質問を正しく理解しているかどうかはわかりませんが、具体的な例が参考になるかもしれません。 - しかし、1) 'enum'は値を関連づけることができる、2)エラーは' struct'または 'class'(プロパティ付き)である可能性があるので、' enum'である必要はありません。 –
私は構造体を使用することができ、オプション2を使うことができますか?それは基本的にはより伝統的な例外オブジェクトと同じですが、その構造体内で列挙型を定義するとあまりにも醜いことはありません。 – devios1
具体的には、単純なパーサーを作成しています。影響を受ける行と列の番号(将来的には他の情報も含む)を保存する場所が必要ですが、すべてのハンドラがそれらを明示的に関連値として追加する必要はありません。 – devios1