2015-09-27 3 views
-1
var myString = "7" 
var possibleInt = Int(myString) 
print(possibleInt) 

Приведенный выше код печатает:Почему код печатает необязательное значение?

Факультативно (7)

Почему он делает это несмотря на то, что я не использовал дополнительный. Строка была преобразована в число так не если из быть:

?

myString = "banana" 
possibleInt = Int(myString) 
print(possibleInt) 

Этот код распечатает нуль, потому что преобразование типа не работает, но я не вижу, как 7 может быть необязательным.

+1

Если это может быть нуль, оно должно быть необязательным. – matt

+0

@matt Почему это может быть ноль? – Nocturnal

+1

Как вы сами сказали. Он может выйти из строя, потому что строка не является числом. – matt

ответ

2

При преобразовании значения (то есть строку в Int) это будет обязательно - если вы пытаетесь запустить:

let num = Int("things") 
// num is Optional(nil) 

Это не могло быть числом, так что возвращает ' пусто ".

Если вы знаете , что строка будет всегда действительное число, которое Вы можете разворачивать это ненадежно:

let num = Int("5")! 
// num is 5, not Optional(5) 

Или, если вы не знаете, если строка будет действительным ИНТ, вы можете безопасно разворачивать его: метод

if let num = Int(myString) { 
    // Do something with the number 
} else { 
    // Catch some error 
} 
+1

Уловка с этим заключается в том, что если вы сделаете 'let num = Int (« Hello »)!', То приложение будет аварийно завершено во время выполнения. Было бы лучше добавить необязательную привязку, а не явное разворачивание. – Fogmeister

0

Int() возвращает необязательное значение, потому что, если ваша строка содержит что-то, что не является числом, например, «abc123», Int («aBC123») возвратит ноль, , а также , метод возвращает необязательный значение не имеет никакого отношения к тому, что является аргументом метода.

1

Красота о вариантах заключается в том, что они создают защитную сетку в вашем коде. Если вы берете другой язык и пытаетесь разобрать «example123» как Int, он сработает и программа завершится. Однако в Swift большинство функций, которые в противном случае могут привести к сбою, возвращают необязательно, так что программа продолжает работать.

Есть два способа избежать получения необязательного значения в конце вашей программы.

Если вы абсолютно уверены в том, что вход в Int() будет целым, вы можете использовать

var possibleInt = Int(myString)! 

И, конечно же, если туЗЬптд не является целым числом, ваше приложение будет врезаться. Однако вы можете безопасно развернуть его, выполнив

if let possibleInt = Int(myString) { 
    // use possibleInt as an int and not an optional 
} 
// otherwise, the program won't do anything with possibleInt 

Надеюсь, это поможет.

Смежные вопросы