Неявно развернутый необязательный параметр по-прежнему является необязательным, хотя гарантированно удерживает значение.
Назначение неявно развернутого дополнительного для обычного необязательного является законным.
Итак, если у вас есть линейная логика в приложении, где вы объявляете необязательную переменную, а затем инициализируете ее с неявным образом развернутым необязательным, было бы лучше использовать необязательный.
Но есть некоторые случаи, когда вы определяете необязательную переменную (скажем, в начале функции), а затем основываясь на условиях, потоке, и т. Д. Ему может быть присвоено значение из разных функций - если не менее один из них может вернуть нормальный факультативный, тогда вы должны объявить переменную как необязательную.
Но в этом случае, даже если все функции, используемые для назначения значения вашей необязательной/необязательной переменной, всегда возвращают либо необязательный, либо (по крайней мере один из них), неявно разворачиваемый необязательно, всегда лучше придерживаться с необязательным объявлением, потому что в будущем вы можете создать новую ветвь кода, которая возвращает нормальный вариант.
Последнее, очень интересно, это, кажется, работает хорошо:
let x: Int! = nil
в то время как я должен признать я ожидал, что это исключение при выполнении. Зная это, я думаю, что с этого момента я всегда буду использовать опцию, когда функция заявляет, что возвращает неявно развернутую.
Больше испытаний:
func test() -> Int! {
return nil
}
let q1: Int? = test() // it works, q1 = nil (expected)
let q2: Int! = test() // it works, q2 = nil (unexpected)
let q3: Int = test() // runtime exception (expected)
Update: Это то, что documentation говорит вместо этого:
Если вы пытаетесь получить доступ к неявным развернутый необязательным, если оно не содержит значения, то вызовет ошибку времени выполнения. Результат точно такой же, как если бы вы поместили восклицательный знак после обычного необязательного, который не содержит значения.
Что означает: назначение nil
нормально, но как только она доступна (т.е. присваивается другой переменной, используется в выражении, и т.д.), то это вызовет ошибку
В текущем (бета-6) SDK, JSONObjectWithData() возвращает 'AnyObject?'. –
Спасибо Martin R, я знаю об этом - хотел использовать пример Криса, чтобы выяснить, почему он назначил неявное явное. – Boon
Раздел в примечаниях к выпуску бета-версии, начиная с * «Большое количество API-интерфейсов Foundation проверено для дополнительного соответствия ...» * также интересно в этом контексте. –