Swift UIImage 扩展

14
我正在尝试使用枚举和便利初始化器来使我的代码更安全,特别是在处理UIImage和资源目录时。以下是我的代码:
import UIKit

extension UIImage {
    enum AssetIdentifier: String {
        case Search = "Search"
        case Menu = "Menu"
    }

    convenience init(assetIdentifier: AssetIdentifier) {
        self.init(named: AssetIdentifier.RawValue)
    }
}

目前我遇到了这个错误:
'无法使用'(named: RawValue.Type)'的参数调用'UIImage.init'。

从Swift 3开始,使用lowerCamelCase来命名枚举的情况。 - undefined
2个回答

11

存在两个问题:

1. 可失败的初始化器

在你的便捷初始化器中,你调用了一个可失败的初始化器。那么,在你依赖于一个没有保证的可失败初始化器的情况下,如何保证始终创建一个UIImage实例呢? 当你调用可失败初始化器时,可以通过使用神奇的!来修复它。

2. 引用所接收的参数

当你调用self.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)

谢谢,我刚刚在刷新页面之前弄明白了。实际上最好不要将此init设为可选值,因为你知道你的枚举值是正确的。 - Cody Weaver
2
@CodyWeaver:如果您认为答案正确,请不要忘记接受它。 - Luca Angeletti

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


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接