Вот первое приближение. Как видите, существует множество повторяющихся шаблонов, которые можно извлечь.
for (i, placeDictI) in 0..<places.enumerated() {
guard
let nameI = placeDictI["name"],
let cityI = placeDictI["city"],
let latitudeI = placeDictI["lat"].map(Double.init),
let longitudeI = placeDictI["lon"].map(Double.init),
else { continue }
let coordinateI = CLLocation(latitude: latitudeI, longitude: longitudeI)
let placeI = Place(name: nameI, city: cityI, lat: latitudeI, long: longitudeI, coordinate: coordinateI)
for (j, placeDictJ) in places.enumerated() where i != j {
guard let nameJ = placeDictI["name"],
let cityJ = placeDictI["city"],
let latitudeJ = placeDictI["lat"].map(Double.init),
let longitudeJ = placeDictI["lon"].map(Double.init)
else { continue }
let coordinateJ = CLLocation(latitude: latitudeJ, longitude: longitudeJ)
let placeJ = Place(name: nameJ, city: cityJ, lat: latitudeJ, long: longitudeJ, coordinate: coordinateJ)
let distanceInMeters = coordinateI.distance(from: coordinateJ) // result is in meters // Editor's note: REALLY? I would have thought that a variable called "distanceInMeters" would store volume in litres! Silly me!
let distanceInMiles = distanceInMeters/1609.344
var distances = [Distance]()
distances.append(Distance(
distanceInMiles: distanceInMiles,
distanceInMeters: distanceInMeters,
places: [ placeI, placeJ ]
))
}
}
Вот преобразования, которые я применил:
- Не проверяйте на
places.count > 0
. Если это 0, цикл ничего не сделает.
- Для каждого оператора
if
, блок которого полностью охватывает родительский блок, я заменил его на guard
.
- Объединены смежные
guard
операторы с запятой.
- Выражение неудачных преобразований типов выражено в виде
Optional.map(_:)
выражений, а не в виде отдельных let
выражений в операторе guard
- Изменил проверку
i != j
на where
на внутреннем цикле for
.
Изменен этот шаблон:
for i in 0..<array.count {
use(array[i])
use(array[i])
use(array[i])
//...
}
к этому шаблону:
for (i, element) in array.enumerated() {
use(element)
use(element)
use(element)
//...
}
Видя, что нет очевидного случая повторения, хороший намек на то, что Словарь, распаковываемый в Place
, принадлежит удобному инициализатору, который принимает диктовку, которая инициализирует Place?
из него. Более того, просто используйте систему Codable и попросите компилятор синтезировать ее для вас.