Swift UIImage extension
You can use this code. I have tested it.
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.
}
}
There are 2 problems:
1. Failable init
In your convenience initializer
you are calling a failable initializer
. So how can you guarantee that an instance of UIImage
is always created when you are relying on a failable initializer
that, by definition, does not guarantee that?
You can fix this by using the magic !
when you call the failable init
.
2. Referencing the param you received
When you call self.init
you are not passing the param received in your init. You are instead referencing the enum definition. To fix this replace this
self.init(named: AssetIdentifier.RawValue)
with this
self.init(named: assetIdentifier.rawValue)
Wrap up
This is the result
extension UIImage {
enum AssetIdentifier: String {
case Search = "Search"
case Menu = "Menu"
}
convenience init(assetIdentifier: AssetIdentifier) {
self.init(named: assetIdentifier.rawValue)!
}
}
Testing
UIImage(assetIdentifier: .Search)