在处理 UIImage 和资产目录时,我试图使用 Enums 和纵容初始值设定项使我的代码更安全。 我的代码在下面。
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 个问题:
1. 可失败的初始化
在你的convenience initializer
你正在打电话给一个failable initializer
.那么,当您依赖一个根据定义不能保证这一点的failable initializer
时,如何保证始终创建UIImage
实例呢?您可以通过在调用failable init
时使用魔术!
来解决此问题。
2. 引用您收到的参数
当你调用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.
}
}