swift2 Swift用户界面图像扩展

55ooxyrt  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(235)

我试图在处理UIImage和Asset Catalog时使用Enums和一个connivence初始化器使我的代码更安全。我的代码如下。

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)'
pprl5pva

pprl5pva1#

存在2个问题:

1.初始化失败

convenience initializer中,您调用的是failable initializer。那么,当您依赖于failable initializer(根据定义,failable initializer不能保证总是创建UIImage的示例)时,如何保证总是创建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)
hgb9j2n6

hgb9j2n62#

你可以用这个代码。我已经测试过了。

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

}

相关问题