Создание CGRect, который включает в себя UIBezierPath и NSArray x Array в процессе - PullRequest
2 голосов
/ 08 марта 2019

Все, что мне нужно сделать, это создать CGRect, который включает в себя UIBezierPath, и у меня есть массив CGPoint.

Чтобы создать CGRect, все, что мне нужно сделать, - это перечислить массив CGPoint и найти минимальные и максимальные координаты X и Y.

Затем я вспомнил, что у старого и доброго NSArray была эта функция, называемая valueForKeyPath, которая могла бы использоваться в сочетании с чем-то вроде valueForKeyPath:@max.x или valueForKeyPath:@min.x, которая делала бы магию, чтобы найти минимальное и максимальное значения х и у.

Я новичок в Swift. Я впервые использую Swift для создания серьезного кода.

Есть ли какая-либо магия в массивах Swift, которую можно использовать для этого вместо создания сложных перечислений и циклов?

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Простое решение, если у вас уже есть UIBezierPath, это просто получить его bounds:

let rect = path.bounds

Если у вас есть массив точек, и вы хотите, чтобы границы которого охватывали эти точки, вы могли бы min и max x и y координаты, но я мог бы reduce union всех точек:

let points = [
    CGPoint(x: 200, y: 200),
    CGPoint(x: 300, y: 300),
    CGPoint(x: 200, y: 400),
    CGPoint(x: 100, y: 300)
]

let rect = points.first.map { firstPoint in
    points.dropFirst()
        .reduce(CGRect(origin: firstPoint, size: .zero)) { rect, point in
            rect.union(CGRect(origin: point, size: .zero))
    }
}
1 голос
/ 08 марта 2019

Хотя у вас все еще есть доступ к value(atKeyPath:) в Swift, для этого существует более идиоматический способ .Мне тоже кажется, что это понятнее.Сохранить вопрос опций, конечно же ...

let list = [CGPoint(x: 10, y: 20),
            CGPoint(x: 1, y: 2),
            CGPoint(x: 100, y: 200)]
let max = list.map { $0.x }.max()
let min = list.map { $0.x }.min()
print(max, min)

// Output: Optional(100.0) Optional(1.0)
...