Цель принудительной распаковки

В быстрой документации вы можете найти это:

if convertedNumber != nil {
    println("convertedNumber has an integer value of \(convertedNumber!).")
}
// prints "convertedNumber has an integer value of 123." 

С этим объяснением

Если вы уверены, что необязательный параметр содержит значение, вы можете получить доступ к его базовому значению, добавив восклицательный знак (!) В конец имени необязательного элемента. Восклицательный знак фактически говорит: "Я знаю, что эта опция определенно имеет значение; пожалуйста, используйте его ". Это называется принудительным развертыванием значения необязательного параметра:

Хорошо, понял, но в чем его польза? Не было бы то же самое, если бы я не принудительно развернул, как:

if convertedNumber != nil {
    println("convertedNumber has an integer value of \(convertedNumber).")
}
// prints "convertedNumber has an integer value of 123."

Спасибо, что просветили меня:)

2 ответа

Решение

Не было бы того же самого, если бы я не заставил развернуть

Нет. Опциональный - это другой тип. Если вы на самом деле запустили приведенный выше код без распаковки (что тривиально на игровой площадке), вы сразу увидите разницу.

Опционально печатает как Optional(123)развернутые отпечатки как 123, Вы не можете передать необязательное что-то, что ожидает определенный тип, не разворачивая его сначала.

Понимание того, что Optional являются совершенно другим типом, а не специализированным типом определенного типа (например, нет "Option Int", есть Optional, который содержит Int), является ключом к пониманию этого. Я написал об этом здесь, если вы заинтересованы в более длинном объяснении.

Кроме того, вы можете условно развернуть дополнительный

if let convertedNumber = <some optional> {
    // If the optional contains a value, then convertedNumber is now the unwrapped value.
    println("convertedNumber has an integer value of \(convertedNumber).")
}
Другие вопросы по тегам