Как реализовать функцию вычисления расстояния между двумя точками
Что проверяют
Простую формулу и то, как вы оформите её на Swift: типы, точность, работа с CGPoint. Задача разминочная, поэтому следом обычно спрашивают, что изменится, если точки это координаты на карте.
Как отвечать
Расстояние на плоскости считается по теореме Пифагора: корень из суммы квадратов разностей координат. В iOS-коде естественно сделать расширение, а не функцию с кортежами:
extension CGPoint {
func distance(to other: CGPoint) -> CGFloat {
hypot(x-other.x, y-other.y)
}
}Что добавить к формуле:
hypot: считает то же, чтоsqrt(dx*dx + dy*dy), но без переполнения и потери точности на очень больших и очень маленьких значениях;- квадрат расстояния: если нужно только сравнивать (ближайшая точка, попадание в радиус касания), корень не нужен, сравнивайте квадраты;
simd: для большого количества точек удобныSIMD2<Double>иsimd_distance;- целые координаты: переводите в
Doubleдо возведения в квадрат. ПереполнениеIntв Swift не заворачивается, а останавливает программу; - географические координаты: евклидова формула по широте и долготе неверна, градус долготы сужается к полюсам. Используйте
CLLocation.distance(from:), который возвращает метры с учётом кривизны Земли,MKMapPoint.distance(to:)или формулу гаверсинусов, если без фреймворков.
Проверку покажите тестом: точки (0, 0) и (3, 4) дают ровно 5, одинаковые точки дают 0, порядок аргументов результат не меняет.
Где спотыкаются
Считают расстояние между городами по градусам как по плоскости. На коротких отрезках у экватора ошибка мала, а в высоких широтах или на сотнях километров цифра получается заметно неверной.
Сравнивают дробный результат через == в тестах. Нужна погрешность: XCTAssertEqual(d, 5, accuracy: 1e-9) в XCTest или явное сравнение модуля разности с эпсилоном в #expect из Swift Testing.
Передают точки неименованными кортежами (Double, Double). Легко перепутать порядок координат, и с остальным кодом UIKit и SwiftUI, где везде CGPoint, такая функция не стыкуется без лишних преобразований.