Использование enum для индексации массива в swift 4.0 - PullRequest
0 голосов
/ 01 июля 2018

iOS 11.x Swift 4.0

Это не компилируется, потому что вы не можете подписать массив с emum, как кажется? Есть ли тип, который я могу использовать, который будет работать?

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)")

Получил ли он работать со статическим var, как это? но могу ли я сделать enum работать?

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

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы можете добавить расширение к 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())")
0 голосов
/ 01 июля 2018

Вы должны использовать rawValue вместо самого экземпляра enum, например, cord[axis.x.rawValue] вместо cord[axis.x]. Подробнее об этом здесь .

...