Быстрое расширение 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.
    }


}