#ios #swift #frameworks #uiimage #nsbundle
#iOS #swift #фреймворки #uiimage #nsbundle
Вопрос:
У меня есть проект, состоящий из нескольких фреймворков, нескольким из которых необходимо инициализировать UIImage
экземпляры. UIImage
по умолчанию в инициализаторе используется значение using Bundle.main
, если вы не указали пакет.
Это означает, что если ресурс изображения, к которому я пытаюсь получить доступ, находится в текущем (неосновном) пакете, то мне нужно указать пакет, иначе он вернется nil
UIImage(named: "MyImage")
.
Я пытаюсь обойти это с помощью чистой реализации, например:
fileprivate class _Foo { }
extension Bundle {
static var current: Bundle { .init(for: Foo.self) }
}
public extension UIImage {
static func inCurrentBundle(named name: String) -> UIImage? {
return UIImage(named: name, in: .current, compatibleWith: nil)
}
}
Указанное Bundle
выше расширение по умолчанию internal
относится к модулю, в котором оно определено, поэтому моя идея заключалась в том, чтобы определить новое extension Bundle
с помощью a Bundle.current
в каждом модуле. Однако это, очевидно, не работает, потому .current
что символ в inCurrentBundle
методе использует реализацию выше него и не «переопределяется» другим, даже если inCurrentBundle
вызывается из другого модуля.
Может кто-нибудь придумать способ настроить это так, чтобы подход работал без необходимости указывать пакет?
Примечание: хотя я, конечно, могу придумать различные обходные пути, я специально пытаюсь придумать элегантное решение, простое и минимальное. Меня особенно интересует, есть ли какой-либо способ предоставить некоторый скелет, который можно переопределить между модулями.