Swift: если изображение существует, вернуть его, в противном случае вернуть ноль
Я пытался найти способ быстро проверить, существуют ли символы и изображения SF.
Во всех ответах, с которыми я сталкивался, оператор объединения nil (
??
), что требует
default
образ, который существует всегда. В моем случае это не работает.
Я хотел бы проверить, существует ли изображение (или символ), а затем вернуть его, если он существует, в противном случае вернуть
nil
.
Как этого добиться?
ВАЖНОЕ ПРИМЕЧАНИЕ
Я пытаюсь добиться этого, используя
SwiftUI
с
Image
для мультиплатформенного приложения. Я стараюсь избегать использования
UIImage
или
NSImage
делать мои чеки.
ОБНОВЛЕНИЕ 1
Примечание 1: при запросе символа SF, который не существует (например, в
systemName: [name]
параметр), изображение отображается как пустая область. (Протестировано с
Label
)
Следующие решения были протестированы и оказались неэффективными:
(Примечание: во всех попытках есть переменная
name: String
)
Решение 1
let image = Image(systemName: name)
if image {
return image
} else {
return nil
}
Выдает ошибку:
Невозможно преобразовать значение типа Image в ожидаемый тип условия Bool
Он выдает ту же ошибку, когда:
let image = Image(name)
Решение 2
if let image = Image(systemName: name) {
return image
}
Выдает ошибку:
Инициализатор для условной привязки должен иметь тип Optional, а не Image.
Решение 3
let image = Image(systemName: name)
if image != nil {
return image
}
Не работает и выдает предупреждение:
Сравнение необязательного значения типа Image с nil всегда возвращает true.
2 ответа
Как вы обнаружили,
Image.init(systemName:)
возвращает какое-то изображение-заполнитель, если имя не распознано.
Если вы хотите определить, распознается ли имя, вы можете попробовать создать
UIImage
с этим.
UIImage.init?(systemName:)
возвращается
nil
если имя не распознано.
let image: Image? = UIImage(systemName: name)
.map { Image(uiImage: $0) }
Над
Image
может вести себя иначе, чем изображение, созданное с помощью
Image(systemName:)
. Я не уверен. Поэтому вы можете сделать следующее, если это проблема:
let image: Image? = UIImage(systemName: name)
.map { _ in Image(systemName: name) }
После rob mayoff я закончил тем, что создал кейсы для ОС, а затем использовал краткие проверки, чтобы определить, существует ли изображение, и выполнить логику.
В конце концов, мне удалось избежать использования
UIImage
или
NSImage
вне фактического чека.
Это неортодоксальный и неэффективный подход, но мой код получился таким:
Для пользовательских изображений
#if os(macOS)
if (NSImage(named: name)) != nil {
//image found, do some logic...
}
#elseif os(iOS)
if (UIImage(named: name)) != nil {
//image found, do some logic...
}
#endif
Для системных символов
#if os(macOS)
if (NSImage(systemSymbolName: name, accessibilityDescription: "")) != nil {
//image found, do some logic...
}
#elseif os(iOS)
if (UIImage(systemName: name)) != nil {
//image found, do some logic...
}
#endif