Я столкнулся с проблемой в Swift после преобразования из Objective-C. Может ли кто-нибудь помочь мне решить эту проблему?
let brand: GymBrand = GymBrand.brandForName(name:self.gym.brand)
if brand && brand.logoImageName {
} else {
}
Мой код Objective-C:
GYMBrand *brand = [GYMBrand brandForName:self.gym.brand];
if (brand && brand.logoImageName) {
}else {
}
Экран ошибки:
Используя этот оператор if, вы проверяете, истинно ли brand
, однако brand
не относится к типу Bool
. Чего именно вы пытаетесь достичь?
@UmairAfzal Я обновил свой код Objective C
как насчет добавления проверки типа "brand! = nil", это будет проверка типа bool вместо прямой проверки бренда.
Истинное лицо вашего быстрого кода таково:
if let brand = GymBrand.brandForName(name:self.gym.brand), brand.logoImageName != nil {
} else {
}
Поскольку logoImageName
будет использоваться в предложении if
, на самом деле это не Истинное лицо вашего кода в кратчайшие сроки ?
Что вам нужно сделать, так это быстро прочитать о дополнительных возможностях.
Вот несколько хороших ссылок для чтения. Есть 2 основных способа добиться желаемого.
if let brand = GymBrand.brandForName(name:self.gym.brand) ,
let imageName = brand.logoImageName {
//brand is never nil here
//brand.logoImageName is never nil here
} else {
}
Здесь мы предполагаем, что GymBrand.brandForName(name:self.gym.brand)
может быть необязательным, что означает, что он может содержать нулевые значения. Используя if let, мы гарантируем, что внутри блока if значение brand никогда не будет равно нулю.
Но, допустим, мы хотим использовать его не внутри блока, а где-либо в функции. Тогда мы можем использовать guard
.
guard let brand = GymBrand.brandForName(name:self.gym.brand) ,let imageName = brand.logoImageName else {
//brand is nil here
//brand.logoImageName is nil here
}
Еще проще: if let imageName = GymBrand.brandForName(name:self.gym.brand)?.logoImageName { ...
Таким образом вы можете сделать это: (как я вижу, вы используете brand.logoImageName, поэтому вы должны использовать этот способ)
if let brand = GymBrand.brandForName(name:self.gym.brand) as? GymBrand, let _ = brand.logoImageName as? String{
//brand is never nil here
//brand.logoImageName is never nil here
} else {
}
as? String
(и, скорее всего, также as? GymBrand
) является избыточным, если logoImageName
в любом случае является необязательным, а let _
бесполезен, поскольку переменная явно используется в предложении if
.
что вы хотите сказать святым, если бренд? Ошибка ясно говорит об этом, вы можете написать только логическую переменную или инструкцию, которая производит bool после ключевого слова if.