我想为 UIImage 编写 init ,它检查 .main 包的资产中是否存在图像(应用程序级别) - 从 .main 中获取它,如果不存在 - 从 .currentModule 中获取它(包级别)
目前它的工作原理就像只从 .currentModule 中获取:
public extension UIImage {
convenience init?(originalName: String) {
self.init(named: originalName, in: .currentModule, with: nil)
}
}
我想找到方法,如果
self.init(named: originalName, in: .main, with: nil)
返回nil
,请致电self.init(named: originalName, in: .currentModule, with: nil)
所以写一些类似的东西
public extension UIImage {
convenience init?(originalName: String) {
if let _ = self.init(named: originalName, in: .main, with: nil)
else
self.init(named: originalName, in: .currentModule, with: nil)
}
}
但是无法编译
这个示例可以编译,但这里是在 .main 包中初始化图像的双重工作:
public extension UIImage {
convenience init?(originalName: String) {
if originalName == "" {
return nil
} else if let _ = UIImage(named: originalName, in: .main, with: nil) {
self.init(named: originalName, in: .main, with: nil)
} else {
self.init(named: originalName, in: .currentModule, with: nil)
}
}
}
(如果您想知道如何使用 init 来实现此目的并使用“originalName:String”参数,-我们和我们的客户已经拥有使用此类 init 的大型代码库,并且有一个枚举而不是 String)
试试这个:
public extension UIImage {
convenience init?(originalName: String) {
if let image = UIImage(named: originalName, in: .main, with: nil) {
self.init(cgImage: image.cgImage!)
} else if let image = UIImage(named: originalName, in: .currentModule, with: nil) {
self.init(cgImage: image.cgImage!)
} else {
return nil
}
}
}