проверка на ноль, все еще сбой говорит, что его ноль - PullRequest
0 голосов
/ 02 июня 2018

У меня есть условие, как показано ниже.

var hotelType: String = "test"

hotelType==hotelInfo.type!

Допустим, hotelInfo имеет структуру, как показано ниже.

struct HotelInfo : Decodable {
    var type: String?
}

Поскольку приложение зависало, говоря, что hotelType было нулем,Я обновляю код, как показано ниже.

hotelType==(hotelInfo.type!==nil ? "" : hotelInfo.type!)

Однако приложение по-прежнему падает, сообщая фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

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

Примечание: , У меня есть альтернативное решение (которое также работает нормально), но наверняка я чувствую этонеправильно.То, что я хотел бы сделать, это добавить еще одну переменную как nil к пустой строке, как показано ниже, и проверить эту переменную.

struct HotelInfo : Decodable {
    var type: String?
    var typeFixed: String? {
        get {
            if (self.type==nil) {
                return ""
            }
            return self.type
        }
    }
}

и использовать эту переменную

hotelType==hotelInfo.typeFixed!

Самое важное

Я делаю это внутри фильтра, поэтому я не могу использовать оператор if let (это реальный код, но я даю выше простую логику, поскольку данные оченьсложный)

finalArray = finalArray.filter { hotels in
    hotels.infos?.contains { roomInfo in
        selectedChain.contains { rt in
            rt == (roomInfo.hotelChain?.supplierHotelChain!==nil ? "" : roomInfo.hotelChain?.supplierHotelChain!)
        }
        } ?? false
}

rt == (roomInfo.hotelChain?.supplierHotelChain!==nil ? "" : roomInfo.hotelChain?.supplierHotelChain!) здесь я проверяю состояние.

Может ли кто-нибудь указать мне правильное направление, чтобы получить нужные данные.

1 Ответ

0 голосов
/ 02 июня 2018

Да, все равно произойдет сбой, потому что вы принудительно разворачиваете hotelInfo.type перед проверкой, является ли nil:

hotelType==(hotelInfo.type!==nil ? "" : hotelInfo.type!)

Сделали ли вы это:

hotelType == (hotelInfo.type == nil ? "" : hotelTypeInfo.type!)

это сработало бы.

Вместо этого используйте оператор nil коалесцирующий ??:

hotelType == (hotelInfo.type ?? "")

В вашем заявлении фильтра:

finalArray = finalArray.filter { hotels in
    hotels.infos?.contains { roomInfo in
        selectedChain.contains { rt in
            rt == (roomInfo.hotelChain?.supplierHotelChain ?? "")
        }
    } ?? false
}
...