Enums seem pretty straightforward, interesting how the recursive typing is implemented. I’m just putting the entire ShapeDimensions
enum because it covers both challenges:
Bronze & Silver Challenge:
enum ShapeDimensions {
case point
case square(side: Double)
case rectangle(width: Double, height: Double)
case rightTriangle(legA: Double, legB: Double)
func area() -> Double {
switch self {
case .point:
return 0
case let .square(side:side):
return side * side
case let .rectangle(width:w, height:h):
return w * h
case let .rightTriangle(legA:a, legB:b):
return (a * b) / 2
}
}
func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side:side):
return 4 * side
case let .rectangle(width:w, height:h):
return 2 * w + 2 * h
case let .rightTriangle(legA:a, legB:b):
return a + b + sqrt(a * a + b * b) // computing the hypotenuse automatically, no need to define in case
}
}
}
var rightTriableShape = ShapeDimenstions.rightTriangle(legA: 1, legB: 1)
I decided to compute the hypotenuse automatically in the perimeter function and not have it specified in the enum type simply because it’s easier and less error-prone. legA
and legB
are as follows:

I used a slightly different method for the square root:
> > case let .rightTriangle(width: w, height: h):
> > return (w * w + h * h).squareRoot() + w + h
Bronze Challenge:
enum ShapeDimensions {
// square's associated value is the length of one side
case square(side: Double)
//rectangle's associated value defines its width and height
case rectangle(width: Double, height: Double)
//point. A point has no dimensions
case point
func area() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side
case let .rectangle(width: w, height: h):
return w * h
}
}
func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * 4
case let .rectangle(width: w, height: h):
return (h * 2) + (w * 2)
}
}
}
var aRect = ShapeDimensions.rectangle(width: 50, height: 40)
print ("My rectangle has a perimeter of \(aRect.perimeter()).")
var aSquare = ShapeDimensions.square(side: 101)
print ("My rectangle has a perimeter of \(aSquare.perimeter()).")
Silver challenge code:
enum ShapeDimensions {
// square's associated value is the length of one side
case square(side: Double)
//rectangle's associated value defines its width and height
case rectangle(width: Double, height: Double)
//point. A point has no dimensions
case point
//right triangle
case rightTriangle(base: Double, height: Double)
func area() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side
case let .rectangle(width: w, height: h):
return w * h
case let .rightTriangle(base: b, height: h):
return (b*h)/2
}
}
func perimeter() -> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * 4
case let .rectangle(width: w, height: h):
return (h * 2) + (w * 2)
case let .rightTriangle(base: b, height: h):
return ((b * b) + (h * h)).squareRoot()
}
}
}
var rTriangle = ShapeDimensions.rightTriangle(base: 20, height: 10)
print("My right triangle has a perimeter of \(rTriangle.perimeter()).")
print("My right triangle has an area of \(rTriangle.area()).")
this was my solution to the silver and bronze challenge for any given triangle (not just the right angled)
enum ShapeDimentions {
//point has no associated values, it is dimentionless
case point
//square's associated value is the length of one side
case square(side: Double)
//rectangle's associated value defines its width and the height
case rectangle(width: Double, height: Double)
//triangle
case triangle(side1: Double, side2: Double, side3: Double)
func area()->Double {
switch self {
case .point:
return 0
case let .square(side: side):
return side * side
case let .rectangle(width: w, height: h):
return w * h
case let .triangle(side1: a, side2: b, side3: c):
let p = self.perimeter() / 2
return sqrt(p * (p - a) * (p - b) * (p - c))
}
}
func perimeter()-> Double {
switch self {
case .point:
return 0
case let .square(side: side):
return 4 * side
case let .rectangle(width: w, height: h):
return 2 * (w + h)
case let .triangle(side1: s1, side2: s2, side3: s3):
return s1 + s2 + s3
}
}
}
var squareShape = ShapeDimentions.square(side: 10.0)
var rectShape = ShapeDimentions.rectangle(width: 5.0, height: 10.0)
var pointShape = ShapeDimentions.point
var triangleShape = ShapeDimentions.triangle(side1: 3, side2: 5, side3: 4)
My answer is still so strange… .
import Cocoa
enum ShapeDimensions{
//正方形的关联值是边长
case square(side: Double)
//长方形的关联值是宽和高
case rectangle(width:Double,height:Double)
//三角形的关联值是底 高 除以2
case triangle(button:Double,height:Double,count:Double);
func area()-> Double{
switch self {
case let .square(side:side):
return side * side;
case let .rectangle(width: w,height: h):
return w * h;
case let .triangle(button: b,height: h, count: c):
return b * h / c
}
}
}
var ShapeSquare = ShapeDimensions.square(side: 10.0);
var ShapeRectangle = ShapeDimensions.rectangle(width: 10.0, height: 5.0);
var ShapeTriangle = ShapeDimensions.triangle(button: 10, height: 5, count: 2)
var count=ShapeSquare.area() + ShapeRectangle.area() + ShapeTriangle.area();
print(count);