import Foundation
/// An enumeration representing errors that can occur during circle calculations.
enum CircleError: LocalizedError {
case negativeRadius
var errorDescription: String? {
switch self {
case .negativeRadius:
return "Radius cannot be negative."
}
}
}
/// A structure to hold the calculated geometric metrics of a circle.
struct CircleMetrics {
let diameter: Double
let circumference: Double
let area: Double
}
/**
Calculates the diameter, circumference, and area of a circle.
- Parameter radius: The radius of the circle (must be non-negative).
- Returns: A `CircleMetrics` instance containing the calculated results.
- Throws: `CircleError.negativeRadius` if the radius is less than zero.
*/
func calculateCircleMetrics(radius: Double) throws -> CircleMetrics {
// Guard clause: radius cannot be negative
guard radius >= 0 else {
throw CircleError.negativeRadius
}
let diameter = 2.0 * radius
let circumference = 2.0 * Double.pi * radius
// Standard multiplication (radius * radius) is more efficient than pow(radius, 2)
let area = Double.pi * (radius * radius)
return CircleMetrics(diameter: diameter, circumference: circumference, area: area)
}
// --- Example Usage ---
do {
let radius: Double = 3.0
// Retrieve calculated metrics
let metrics = try calculateCircleMetrics(radius: radius)
// Output results formatted to 2 decimal places
print("Radius: \(radius)")
print("Diameter: \(metrics.diameter)")
print(String(format: "Circumference: %.2f", metrics.circumference))
print(String(format: "Area: %.2f", metrics.area))
}
catch {
print("Error: \(error.localizedDescription)")
}
/*
run:
Radius: 3.0
Diameter: 6.0
Circumference: 18.85
Area: 28.27
*/