在处理 UIImage 和资产目录时,我试图使用枚举和方便的初始化程序使我的代码更安全。我的代码在下面。
import UIKit
extension UIImage {
enum AssetIdentifier: String {
case Search = "Search"
case Menu = "Menu"
}
convenience init(assetIdentifier: AssetIdentifier) {
self.init(named: AssetIdentifier.RawValue)
}
}
目前我收到此错误。
'Cannot invoke 'UIImage.init' with an argument of type '(named: RawValue.Type)'
有2个问题:
在您的
convenience initializer
中,您正在调用 failable initializer
。那么,当您依赖于根据定义不能保证的 UIImage
时,如何保证始终创建 failable initializer
的实例呢?
您可以在调用 !
时使用魔法 failable init
来解决此问题。
当您调用
self.init
时,您没有传递 init 中收到的参数。相反,您正在引用枚举定义。要修复此问题,请替换此
self.init(named: AssetIdentifier.RawValue)
有了这个
self.init(named: assetIdentifier.rawValue)
这就是结果
extension UIImage {
enum AssetIdentifier: String {
case Search = "Search"
case Menu = "Menu"
}
convenience init(assetIdentifier: AssetIdentifier) {
self.init(named: assetIdentifier.rawValue)!
}
}
UIImage(assetIdentifier: .Search)
您可以使用此代码。我已经测试过了
import UIKit
import Foundation
enum AssetIdentifier: String {
case Search = "Search"
case Menu = "Menu"
}
extension UIImage {
convenience init?(assetIdentifier: AssetIdentifier) {
self.init(named: assetIdentifier.rawValue)
}
}
class ViewController: UIViewController {
@IBOutlet var imageview: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageview.image = UIImage(assetIdentifier: AssetIdentifier.Menu)
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension UIImage {
class var share: UIImage? {
return .init(systemName: "square.and.arrow.up")
}
}
用途:
var yourImage: UIImage = .share
或
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .share, style: .plain, target: self, action: #selector(shareTap))