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
Другие вопросы по тегам