Вопрос или проблема
print("int==1.0--\(Int("1.0") ?? 0)")
print("int==1--\(Int("1") ?? 0)")
Полученный мной вывод
int==1.0--0
int==1--1
Ожидаемый вывод
int==1.0--1
int==1--1
Есть идеи, почему в первой строке вывод не равен 1
Примечание :
print("int==1--\(Int(1.0) )")
Это дает вывод 1
.
Причина в том, что “1.0” не является допустимым строковым представлением целого числа, поэтому Int(“1.0”) не возвращает целочисленное значение, и именно поэтому вы получили 0 вместо 1.
Я предоставляю исправленный код.
if let floatVal = Double("1.0") {
print("int==1.0--\(Int(floatVal))")
} else {
print("int==1.0--0")
}
print("int==1--\(Int("1") ?? 0)")
Надеюсь, это поможет вам.
Решение в одну строку:
print("int==1.0--\(Int(Float("1.0") ?? 0.0))")
print("int==1--\(Int("1") ?? 0)")
Инициализатор, который вы вызываете, используя строковый аргумент, описан здесь и имеет следующие требования к входным данным
Строка, переданная в качестве описания, может начинаться с символа плюс или минус (+ или -), за которым следуют одна или несколько цифр (0-9).
Поскольку ваша строка также содержит точку, это нарушает правило, и инициализация не удается, возвращая nil.
Что касается другого инициализатора, принимающего Double
, документация утверждает, что
Любая дробная часть значения, переданного в качестве источника, удаляется с округлением значения к нулю.
Поэтому это правильно вернет 1.
Ответ или решение
Причина, по которой строка "1.0" не преобразуется в целое число в вашем коде, связана с тем, что инициализатор Int
не принимает строку с десятичной частью, как вы и заметили. Метод Int(_: String)
требует, чтобы строка представляла собой валидное целое число, и строка "1.0" не удовлетворяет этому требованию. В результате попытка вызвать Int("1.0")
возвращает nil
, и ваш код получает значение 0
из-за оператора nil-coalescing (??
).
Для решения этой проблемы вы можете сначала преобразовать строку "1.0" в число с плавающей запятой (Double
), а затем преобразовать его в целое число. Вот корректированный код:
if let floatVal = Double("1.0") {
print("int==1.0--\(Int(floatVal))") // Это станет "int==1.0--1"
} else {
print("int==1.0--0")
}
print("int==1--\(Int("1") ?? 0)") // Это станет "int==1--1"
В этом примере мы сначала проверяем, может ли строка "1.0" быть преобразована в Double
. Если это удается, мы затем преобразуем полученное значение в Int
, что и дает вам желаемый результат 1
.
Альтернативно, если вы хотите использовать более компактный одинарный вызов, вы можете сделать так:
print("int==1.0--\(Int(Double("1.0") ?? 0.0))")
print("int==1--\(Int("1") ?? 0)")
В этом коде мы используем Double
для обработки строки "1.0", чтобы преобразовать её в Int
. Этот подход также приводит к ожидаемому результату.
Важно отметить, что инициализатор Int(_: String)
применяется только к строкам, которые представляют собой целые числа (например, "1", "-2"). Строки с десятичной точкой, такие как "1.0", не соответствуют этому критерию, что приводит к неудаче и возврату nil
.
Дополнительно, как уже упоминалось, документация Apple подтверждает, что строка, переданная в инициализатор, может начинаться со знака "плюс" или "минус", за которым следуют одна или несколько цифр (0-9). Это объясняет, почему "1.0" не может быть проинициализировано как Int
.
Таким образом, для получения желаемого поведения в вашем коде необходимо выполнять промежуточное преобразование через тип Double
, прежде чем выполнять преобразование в тип Int
.