Custom Errors in Swift
import Foundation
// A custom error type usually has the suffix "Error".
struct ArgError: Error {
let arg: Int
let message: String
}
// Adding this localizedDescription property makes ArgError
// conform to the Error protocol.
extension ArgError: LocalizedError {
var errorDescription: String? {
return "\(arg) - \(message)"
}
}
func f(_ arg: Int) throws -> Int {
if arg == 42 {
// Throw our custom error.
throw ArgError(arg: arg, message: "can't work with it")
}
return arg + 3
}
func main() {
do {
let _ = try f(42)
} catch {
// `as?` is Swift's equivalent to Go's `errors.As`.
// It checks if the error can be cast to a specific type.
if let ae = error as? ArgError {
print(ae.arg)
print(ae.message)
} else {
print("err doesn't match ArgError")
}
}
}
main()This Swift code demonstrates how to create and use custom errors. Here’s a breakdown of the key elements:
We define a custom error type
ArgErrorthat conforms to theErrorprotocol.We extend
ArgErrorto conform toLocalizedError, providing a custom error description.The
ffunction can throw our custom error.In the
mainfunction, we use a do-catch block to handle potential errors.We use Swift’s
as?operator to check if the caught error is of typeArgError. This is similar to Go’serrors.Asfunction.
To run this program, you would save it as a .swift file and use the Swift compiler:
$ swift custom-errors.swift
42
can't work with itThis example shows how Swift handles custom errors, which is conceptually similar to Go but with syntax and patterns that are idiomatic to Swift.