【发布时间】:2019-07-12 03:15:27
【问题描述】:
由于我无法控制的原因,我正在处理的一个项目最近被拆分为多个较小的项目。
我们在一个项目中有一些帮助方法来创建速记和键入安全图像请求...这样做的原因是在主题方面具有灵活性。也许一个主题 detailDisclosure 与其他主题不一样。
语法是这样的
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)
意味着我们显然可以破解它,但我想知道是否有一个优雅的解决方案来获取发件人或就此而言的捆绑,而无需消费者将其隐式发送到函数?
感谢您的宝贵时间
【问题讨论】: