使用枚举在Swift 4.0中对数组进行下标

时间:2018-07-01 09:26:24

标签: swift struct enums

iOS 11.x Swift 4.0

这无法编译,因为您似乎无法用emem下标数组?我可以使用一种可以使用的类型吗?

enum axis:Int {
  case x = 0
  case y = 1
}

var cords = [[10,21],[23,11],[42,12],[31,76]]
var smallestCord:Int = Int.max
var smallestSet:[Int] = []
for cord in cords {
  if cord[axis.x] < smallestCord {
    smallestCord = cord[axis.x]
    smallestSet = cord
  }
}
print("\(smallestCord) \(smallestSet)")

它可以与像这样的静态变量一起工作吗?但是我可以进行枚举工作吗?

private struct axis {
  static let x = 0
  static let y = 1
}

2 个答案:

答案 0 :(得分:2)

您可以通过在Array上添加扩展名来实现,但这是“您可以做什么”而不是“您应该做什么”的一种情况。

extension Array {
    subscript(index: axis) -> Element {
        return self[index.rawValue]
    }
}

您应该做的是定义适当的数据结构来封装数据:

struct Point {
    var x: Int
    var y: Int

    // For when you need to convert it to array to pass into other functions
    func toArray() -> [Int] {
        return [x, y]
    }
}

let cords = [
    Point(x: 10, y: 21),
    Point(x: 23, y: 11),
    Point(x: 42, y: 12),
    Point(x: 31, y: 76)
]
let smallestSet = cords.min(by: { $0.x < $1.x })!
let smallestCord = smallestSet.x
print("\(smallestCord) \(smallestSet.toArray())")

答案 1 :(得分:1)

您应该使用rawValue而不是枚举实例本身,例如使用cord[axis.x.rawValue]而不是cord[axis.x]。进一步了解here