Переопределение внутреннего символа в разных модулях в Swift

#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 вызывается из другого модуля.

Может кто-нибудь придумать способ настроить это так, чтобы подход работал без необходимости указывать пакет?

Примечание: хотя я, конечно, могу придумать различные обходные пути, я специально пытаюсь придумать элегантное решение, простое и минимальное. Меня особенно интересует, есть ли какой-либо способ предоставить некоторый скелет, который можно переопределить между модулями.