Swift UIImage 扩展

Swift UIImage extension

在处理 UIImage 和 Asset Catalog 时,我试图使用枚举和方便的初始化程序使我的代码更安全。我的代码在下面。

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.
    }


}