Вы пытаетесь сравнить строки , а не числа здесь:
let left = rangeA.last(where: { $0 <= String(userInput)})!
let right = rangeA.first(where: { $0 >= String(userInput)})!
Это означает, что они будут сравниваться в словарном порядке или лексикографически . В порядке словаря, 1000
предшествует 450
, поэтому оно «меньше» 450
. И поскольку 1000
является последним элементом в массиве, он выбирается как последний, который меньше 450.
Вместо этого следует преобразовать элементы массива в Int
и сравнить вместо Int
s:
let left = rangeA.last(where: { Int($0)! <= userInput})!
let right = rangeA.first(where: { Int($0)! >= userInput})!
На самом деле, почему бы просто не сделать тип параметра [Int]
вместо [String]
?
func closestNumbers(_ column: [Int], value: Int) {
Тогда вам вообще не нужно никаких преобразований.
Обратите внимание, что это будет работать, только если rangeA
отсортировано. Если сортировка rangeA
не гарантируется, вы должны сначала отсортировать ее.