Очевидно, что существует много способов, один из которых (который не создает промежуточный массив или не требует сортировки row
) - это reduce
:
row.reduce(nil as Int?) { minSoFar, this in
guard this != 0 else { return minSoFar }
guard let minSoFar = minSoFar else { return this }
return min(minSoFar, this)
}
, что эквивалентно,но более читабельным, чем, короче:
row.reduce(nil as Int?) { $1 != 0 ? min($0 ?? $1, $1) : $0 }
Результат является необязательным, поскольку не может быть никаких ненулевых элементов.
edit : min(by:)
Решение также может действительно использоваться, но оно также несколько нечитаемо и возвращает 0
в случае отсутствия ненулевых элементов (вместо nil
):
row.min { $0 == 0 ? false : ($1 == 0 ? true : $0 < $1) }