swift - 查找自动调用函数的包

标签 swift bundle xcasset

由于我无法控制的原因,我正在从事的一个项目最近被拆分成多个较小的项目。

我们在一个项目中有一些辅助方法来创建速记和类型安全的图像请求...这样做的原因是围绕主题具有灵 active 。也许一个主题 detailDisclosure 与另一个主题不一样。

语法是这样的

public extension UIImageView {
    convenience init(_ key: UIImage.Key) {
        self.init(image: UIImage(named: theme.imageName(for: key)))
    }
}

让 imageView = UIImageView(.detailDisclosure)

还有它的姊妹函数

让图像 = UIImage(.detailDisclosure)

当所有图像和主题位于同一位置时,这是非常简单的事情。但是现在我们有不同的项目,它们在不同的 Assets 文件夹中有不同的 Assets 。

所以我必须添加的是这个......

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 实际上可以是这个 bundle 中的任何类,从技术上讲,您也可以转到另一个 bundle 并以这种方式共享它的资源。

不过,从消费者的角度来看,我希望避免这种额外的努力,而且在我看来,这对新手来说也是相当危险的。

更好的是,除非此 API 的使用者指定不同的 locality,否则我们会自动为他们找到他们的位置;而不是转到主包的当前解决方案。

将来,这些请求中的大部分将来自拥有自己 Assets 的项目。

我见过的例子 文件:String = #file

convenience init(_ key: UIImage.Key, file: String = #file, in locality: AnyClass? = nil)

这意味着我们显然可以破解它,但我想知道是否有一个优雅的解决方案来获取发送者或就此而言 bundle ,而无需消费者隐式地将其发送给函数?

谢谢你的时间

最佳答案

“自动从哪个 bundle 调用了一个函数”

尽管这听起来很有吸引力,但您realllllly不希望这样。当您发现将一些代码从一个项目复制/粘贴到另一个项目会导致其行为不同时,您就会失去理智。

相反,我认为整个方法都需要重新设计。其一,UIImage 似乎是错误的抽象点。相反,我会使用这样的东西:

import UIKit

class ImageProvider {
    let bundle: Bundle

    init(bundle: Bundle) {
        self.bundle = bundle
    }

    init(forMainClass mainClass: AnyClass) {
        self.init(bundle: Bundle(for: mainClass)!)
    }

    func image(
        named: String,
        with configuration: UIImage.Configuration? = nil
    ) -> UIImage {
        return UIImage(named: name, in: self.bundle, with: configuration)?
    }
}

每个应用都会创建自己的 ImageProvider,它会在自己的包中搜索 Assets 。

这有几个关键优势:

  1. 接口(interface)可以很容易地提取到协议(protocol)中,并且可以创建模拟实现以用于测试。
  2. 您有进入图像系统的单一入口点,可以处理缓存、主题、大小调整等。
  3. 您可以扩展它以处理对多个包的查找(“首先搜索我的应用包,如果没有,试试这个框架的包”)
  4. 您可以扩展它以使用枚举来识别图像,而不是原始字符串。

关于swift - 查找自动调用函数的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56999751/

相关文章:

swift - 在 swift 中将文本从 UITextField 发送到短信

ios - 来自 URL 的 PDF 在 WKWebView 中无法正确显示?

ios - 为什么 uitextfield 不输出可选?

javascript - 将 JS 文件与 webpack 脚本 bundle 在一起?

ios - 如何在 NSBundle 中从 Assets.car(xcassets 的编译版本)加载图像?

swift - SwiftUI 中 macOS 的侧边栏菜单

git bundle 验证崩溃

android - EditText 不会在屏幕方向更改时自动保存

ios - iphone 5 和 6 的导航栏图像

ios - iOS 会屏蔽所有应用程序图标还是仅屏蔽主屏幕上的应用程序图标?