Генерация символов актива в пакете Swift

В моем проекте SwiftUI есть пакет Swift, который включает стили для компонентов пользовательского интерфейса. Кроме того, этот пакет включает папку ресурсов, содержащую ресурсы, которые можно использовать при стилизации. Я могу получить изображение по его имени, но мне хотелось бы знать, могу ли я получить доступ к изображениям с помощью перечислений. Потому что Xcode 15 автоматически генерирует символы для ресурсов.

Следующий пример пояснит, что я имею в виду:

      public struct CheckboxToggleStyle: ToggleStyle {
@Binding var color: Color

let checked = Image("checkbox-checked", bundle: .module) // ✅ works
let unchecked = Image("checkbox-unchecked", bundle: .module) // ✅ works
let checked = Image(.checkboxChecked) // ❌ failed
let unchecked = Image(.checkboxUnchecked) // ❌ failed

public func makeBody(configuration: Configuration) -> some View {
    (configuration.isOn ? checked : unchecked)
        .renderingMode(.template)
        .foregroundColor(color)
        .onTapGesture {
            withAnimation {
                configuration.isOn.toggle()
            }
        }
}

}

2 ответа

Правильный синтаксис:Image(resource: .checkboxChecked)(нетImage(.checkboxChecked))

Вот как я это делаю. Если вам нужна более подробная информация, посмотрите мой пакет по адресу https://github.com/iconoir-icons/iconoir-swift/tree/main .

В конечном счете, вам нужно будет определить перечисление с любым именем, а затем назначить все соответствующиеSymbol Namesв качестве строк для перечисления, а затем используйте служебный метод или вычисляемое свойство перечисления. Теоретически вы также можете написать сценарий, который будет автоматически захватывать все имена символов и генерировать для вас перечисление, что я и сделал в итоге.Iconoirпоскольку я не могу вручную набирать более 1000 объявлений перечислений.

Перечисление

      public enum Iconoir: String, CaseIterable {
    case bell = "bell"

Выполнение

      @available(iOS 13, macOS 10.15, *)
public extension Iconoir {
    /// Returns a SwiftUI Image of the Iconoir icon.
    var asImage: Image {
        return Image(self.rawValue, bundle: Bundle.module)
            .renderingMode(.template)
    }
    
    
    /// Returns an image, from the Iconoir bundle, if there is a matching key.
    /// - Parameter string: key that matches iconoir icon.
    /// - Returns: SwiftUI Image
    static func image(from string: String) -> Image {
        return Image(string, bundle: Bundle.module)
            .renderingMode(.template)
    }
}
#endif

Применение

      Iconoir.bell.asImage
Iconoir.bell.asUIImage
Iconoir.image(from: "bell")

другие мысли

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

      var image: Image { 
    //... 
}
Другие вопросы по тегам