【问题标题】:Unresolved identifier errors in case statement案例语句中未解决的标识符错误
【发布时间】:2016-08-31 20:55:07
【问题描述】:

此代码导致perimeter() 函数内部出现“未解析的标识符”错误:

enum ShapeDimensions {
  case Square(Double)                                             // Associated value defined by length of one side
  case Rectangle(width: Double, height: Double)                   // Associate value defined by width and height
  case Point                                                      // No Associated value
  case RightTriangle(baseLength: Double, sideHeight: Double)      // Associated value defined by base length and height

  func area() -> Double {
    switch self {
      case let .Square(side):
        return side * side
      case let .Rectangle(width: w, height: h):
        return w * h
      case .Point:
        return 0.0
      case .RightTriangle(baseLength: l, sideHeight: h):
        return 0.5 * l * h
    }
  }

  func perimeter() -> Double {
    switch self {
      case let .Square(side):
        return 4 * side
      case let .Rectangle(width: w, height: h):
        return 2 * w + 2 * h
      case .Point:
        return 0.0
      case .RightTriangle(baseLength: l, sideHeight: h):
        return sqrt(l * l + h * h) + l + h
    }
  }

}

var squareShape = ShapeDimensions.Square(10.0)
var rectShape = ShapeDimensions.Rectangle(width: 5.0, height: 10.0)
var pointShape = ShapeDimensions.Point
var rightTriangleShape = ShapeDimensions.RightTriangle(baseLength: 5.0, sideHeight: 10.0)

print("Square's area = \(squareShape.area())")
print("Retangle's area  = \(rectShape.area())")
print("Point's area  = \(pointShape.area())")
print("Right Triangle's area = \(rightTriangleShape.area())")

print("Square's perimeter = \(squareShape.perimeter())")
print("Retangle's perimeter  = \(rectShape.perimeter())")
print("Point's perimeter  = \(pointShape.perimeter())")
print("Right Triangle's perimeter  = \(rightTriangleShape.perimeter())")

我收到以下错误:

14-Enumerations.playground:221:29:错误:使用未解析的标识符“h” 返回 sqrt(l * l + h * h) + l + h ^ 14-Enumerations.playground:221:33:错误:使用未解析的标识符“h” 返回 sqrt(l * l + h * h) + l + h ^ 14-Enumerations.playground:221:38:错误:使用未解析的标识符“l” 返回 sqrt(l * l + h * h) + l + h ^ 14-Enumerations.playground:221:42:错误:使用未解析的标识符“h” 返回 sqrt(l * l + h * h) + l + h

代码有什么问题?

【问题讨论】:

  • 因为你忘记了那些行中的let...比较case .RightTriangle(baseLength: l, sideHeight: h):case let .Rectangle(width: w, height: h):
  • 您缺少来自case .RightTriangle(baseLength: l, sideHeight: h)let
  • 所以你的问题标题应该是“在没有 let 语句的情况下未解决的标识符错误”:)
  • 已修复,@MartinR :p 我在诊断之前进行了编辑。

标签: swift compiler-errors


【解决方案1】:

只需在每个案例之前添加 let 就可以了。

enum ShapeDimensions {
  case Square(Double)                                             // Associated value defined by length of one side
  case Rectangle(width: Double, height: Double)                   // Associate value defined by width and height
  case Point                                                      // No Associated value
  case RightTriangle(baseLength: Double, sideHeight: Double)      // Associated value defined by base length and height

  func area() -> Double {
    switch self {
      case let .Square(side):
        return side * side
      case let .Rectangle(width: w, height: h):
        return w * h
      case let .Point:
        return 0.0
      case let .RightTriangle(baseLength: l, sideHeight: h):
        return 0.5 * l * h
    }
  }

  func perimeter() -> Double {
    switch self {
      case let .Square(side):
        return 4 * side
      case let .Rectangle(width: w, height: h):
        return 2 * w + 2 * h
      case let.Point:
        return 0.0
      case let .RightTriangle(baseLength: l, sideHeight: h):
        return sqrt(l * l + h * h) + l + h
    }
  }

}

var squareShape = ShapeDimensions.Square(10.0)
var rectShape = ShapeDimensions.Rectangle(width: 5.0, height: 10.0)
var pointShape = ShapeDimensions.Point
var rightTriangleShape = ShapeDimensions.RightTriangle(baseLength: 5.0, sideHeight: 10.0)

print("Square's area = \(squareShape.area())")
print("Retangle's area  = \(rectShape.area())")
print("Point's area  = \(pointShape.area())")
print("Right Triangle's area = \(rightTriangleShape.area())")

print("Square's perimeter = \(squareShape.perimeter())")
print("Retangle's perimeter  = \(rectShape.perimeter())")
print("Point's perimeter  = \(pointShape.perimeter())")
print("Right Triangle's perimeter  = \(rightTriangleShape.perimeter())")

【讨论】:

  • 您不需要在case let .Point 中添加let,因为您没有绑定任何变量
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2014-10-05
  • 2019-05-01
  • 1970-01-01
  • 2018-12-05
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多