Swift UIImage extension



在处理 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.
    }

}

最新更新