Я некоторое время программировал на Swift, и я думаю, что должен был поставить ! на все мои переменные поля let, которые не были определены сразу.
Сегодня я замечаю, что этот кусок кода не компилируется, и я очень удивлен? почему это?
class MyClass : Mapper {
var a: Bool!
required init?(_ map: Map) {
}
// Mappable
func mapping(map: Map) {
a <- map["a"]
}
}
let myClass = MyClass()
if myClass.a { // Compiler not happy
// Optional type 'Bool!' cannot be used as a boolean; test for '!= nil' instead
}
if true && myClass.a { // Compiler happy
}
if myClass.a && myClass.a { // Compiler happy
}
Apple Swift версии 2.2
Изменить
Некоторые люди указывают, почему я использую let
для переменной, которая никогда не изменится. Я упомянул, что это для переменных поля, но я сокращаю пример. При использовании ObjectMapper (http://github.com/Hearst-DD/ObjectMapper) все поля не определяются сразу в файле init. Вот почему они все либо необязательны? или обязательно!
if
иswitch
неявно развернутые опции не разворачиваются автоматически принудительно (если вы просто используете их сами по себе). Это чтобы можно было смело сравнивать их сnil
. См. stackoverflow.com/questions/33670991/ - person Hamish   schedule 06.05.2016if a! {
- person vacawama   schedule 06.05.2016if let
для предотвращения сбоя. Если я используюif true && a
, меня уволят. - person jsgoupil   schedule 06.05.2016if a ?? false {
, что менее странно, чемif let a = a where a {
. - person vacawama   schedule 06.05.2016if case true? = a {
:) - person Martin R   schedule 06.05.2016let
почти никогда не должно быть неявно развернутым необязательным. Измените его на обычныйBool
. - person rob mayoff   schedule 06.05.2016if a.boolValue {
вылетит, еслиa
будетnil
. Как иif a as Bool {
. - person vacawama   schedule 06.05.2016if a! {
(безопасность этих обходных путей - это еще одно обсуждение, imo; как пишет Роб Мэйофф; зачем вообще использовать неявный развернутый необязательный для этого случая) - person dfrib   schedule 06.05.2016a
бытьnil
, если объект инициализируется из какого-то JSON? - person Martin R   schedule 06.05.2016