Быстрое расширение UIImage
Я пытаюсь сделать мой код более безопасным, используя Enums и инициализатор поминовения при работе с 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)'
Ответы
Ответ 1
Есть 2 проблемы:
1. Сбой init
В convenience initializer
вы вызываете failable initializer
. Итак, как вы можете гарантировать, что экземпляр UIImage
всегда создается, когда вы полагаетесь на failable initializer
, который по определению не гарантирует этого?
Вы можете исправить это, используя волшебство !
, когда вы вызываете 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)
Ответ 2
Вы можете использовать этот код. Я проверил это.
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.
}
}