Проект, над которым я работаю, был недавно разбит на несколько небольших проектов по независящим от меня причинам.
У нас есть несколько вспомогательных методов в одном проекте для создания сокращений и ввода безопасных запросов изображений ... Причина этого заключается в гибкости их оформления.Может быть, одна тема подробно раскрывается не так, как другая.
Синтаксис выглядит следующим образом
public extension UIImageView {
convenience init(_ key: UIImage.Key) {
self.init(image: UIImage(named: theme.imageName(for: key)))
}
}
let imageView = UIImageView(.detailDisclosure)
и его дочерняя функция
let image = UIImage(.detailDisclosure)
Довольно простая вещь, когда все изображения и темы живут в одном месте.Однако теперь у нас есть разные проекты, которые имеют разные активы в разных папках активов.
Так что я должен был добавить, чтобы эта работа была такой ...
convenience init(_ key: UIImage.Key, in locality: AnyClass? = nil) {
self.init(image: UIImageView.localImage(named: key.rawValue, in: locality))
}
// Currently assumes this method and default assets are in the main bundle by default
fileprivate static func localImage(named name: String, in locality: AnyClass?) -> UIImage? {
let bundle = (locality != nil) ? Bundle(for: locality!) : Bundle.main
return UIImage(named: name, in: bundle, compatibleWith: nil)
}
let image = UIImage(.detailDisclosure, in: ThisProjectTheme.self)
ThisProjectTheme
на самом деле может быть любым классом внутри этого пакета, и технически вы можете перейти к другому пакету и таким же образом разделить его ресурсы.
Однако с точки зрения потребителя это дополнительное усилиечто-то, чего я хотел бы избежать, и это также довольно опасно для новичков, на мой взгляд.
Что было бы лучше, если бы потребитель этого API не указал другое locality
, мы находим его местонахождениедля них автоматически;вместо текущего решения перейти в основной комплект.
В будущем большинство этих запросов будут поступать от проектов, имеющих собственные активы.
Я видел, например, file: String = #file
convenience init(_ key: UIImage.Key, file: String = #file, in locality: AnyClass? = nil)
Значит, мы можем, очевидно, взломать его, но мне интересно, есть ли элегантное решение для получения отправителя или, если на то пошло, без того, чтобы потребитель неявно отправлял его функции?
Спасибо за ваше время