gpt4 book ai didi

ios - Xcode8:图像字面量在框架中的使用

转载 作者:可可西里 更新时间:2023-11-01 03:05:53 26 4
gpt4 key购买 nike

我目前正在更新一个项目以使用image literals,以享受非可选图像的好处。该项目正在导入各种框架,框架中包含图像。

在框架中,我们必须在 UIImage 上声明一个扩展来覆盖初始化程序,因为它在错误的包中寻找图像。我们做了类似的事情:

extension UIImage {   
convenience init?(framework_named imageName: String) {
let bundle = Bundle(for: ClassNameInFramework.self)
self.init(named: imageName, in: bundle, compatibleWith: nil)
}
}

我也想在框架中使用图像文字,但和以前一样,文字正在寻找错误的图像包和应用程序崩溃

有谁知道,如何指定要查找图像的包的图像文字?

最佳答案

我发现了一个非常简单的解决方法,但很惊讶在其他帖子中找不到它。我希望它可以更优雅,但在我看来,它比使用字符串类型的 UIImage(named:in:compatibleWith:) 初始化器更可取。

我们基本上利用了 _ExpressibleByImageLiteral 协议(protocol),这是 Xcode 用来确定一个类型是否可以用图像文字表达的。它是 Swift 标准库的一部分,但它对自动完成是隐藏的,我猜是因为想要用图像文字初始化自定义类型并不常见。然而,这正是我们想要的,并且其行为与其他 ExpressibleBy 协议(protocol)完全一样。

struct WrappedBundleImage: _ExpressibleByImageLiteral {
let image: UIImage?

init(imageLiteralResourceName name: String) {
let bundle = Bundle(for: ClassInFramework.self)
image = UIImage(named: name, in: bundle, compatibleWith: nil)
}
}

请注意,我使用包装器而不是 UIImage 子类,这似乎是更好的选择。可悲的是,像 UIImage 这样的类并不打算被子类化,如果你这样做,你会发现自己很头疼。

现在它的用法变成了:

let image = (🏞 as WrappedBundleImage).image

不像普通图像文字那样简洁,但它是我们目前所能获得的最好的。我们只需要记住执行 as 转换,否则我们的自定义初始化器将不会被调用。

你也可以这样做:

extension UIImage {
static func fromWrappedBundleImage(_ wrappedImage: WrappedBundleImage) -> UIImage? {
return wrappedImage.image
}
}

现在我们可以像这样使用它:

UIImage.fromWrappedBundleImage(🏞)

希望这对您有所帮助!

关于ios - Xcode8:图像字面量在框架中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com