Я просто помещаю это здесь, чтобы показать другой дизайн, видя, что я не могу поместить код в комментарий.
Семантика вашего кода, связанного с обработчиком завершения, по сути такова:
Если есть хотя бы один образец, дайте его без ошибок. В противном случае выдайте ошибку, если мы получили ошибку, или укажите, что выборок не было.
У вас ошибка «без выборок», поэтому нам не нужна ошибка «нет первой выборки» , Это не нужно, поэтому мы можем избавиться от этого.
Возможный рефакторинг может выглядеть примерно так.
// We either give a sample, or some error.
if let samples = samples as? [HKWorkout], let first = samples.first {
handler(first, nil)
} else {
handler(nil, .generalError(error?.localizedDescription ?? "no samples"))
}
Это та же семантика, более четко выраженная.
Это это не ответ, но так как вашему обработчику никогда не будут даны пример и ошибка, и вы получаете ошибку, когда знаете, что у вас есть выборки в ваших собственных данных тренировки, то, возможно, виновником является код предиката / запроса?