Вы выходите за пределы Int
таким значением, как 20000000000000000000
. Следовательно (и это предположение, поскольку вы не предоставили код, в котором answer
задается значение), если answer
устанавливается из значения atoi("20000000000000000000")
, answer
никогда не будет больше 2147483647
или меньше -2147483648
, поскольку знаковый Int
не может содержать значения за пределами этого диапазона. Вместо этого оно будет отображаться как число где-то в пределах этого диапазона, который представляет собой 0, который вы видите, и поэтому никогда не удовлетворяет условию возврата либо MAX
, либо MIN
.
Следовательно, чтобы улучшить это , вы можете начать с использования strtol
вместо atoi
, которое возвращает signed long
, а не signed int
. Это дает вам больший размер данных для сравнения, и затем вы можете вернуться к проверке длины строки, чтобы отклонить строки для большего количества символов (цифр), чем в значениях MAX
или MIN
.
strtol
функция подпись: strtol(__str: UnsafePointer<Int8>!, __endptr: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>!, __base: Int32)
Что может быть использовано в следующем:
let input = "20000000000000000000"
let MAX: Int = 2147483647
let MIN: Int = -2147483648
if input.count > 11 && input.hasPrefix("-") {
return MIN
}
else if input.count > 10 {
return MAX
}
let answer = strtol(input, nil, 0)
if answer > MAX { return MAX }
if answer < MIN { return MIN }