Swift UIImage扩展

Cod*_*ver 10 image init ios swift swift2

在处理UIImage和资产目录时,我正在尝试使用Enums和connivence初始化程序使代码更安全.我的代码如下.

import UIKit

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

    convenience init(assetIdentifier: AssetIdentifier) {
        self.init(named: AssetIdentifier.RawValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我收到此错误.

'Cannot invoke 'UIImage.init' with an argument of type '(named: RawValue.Type)'
Run Code Online (Sandbox Code Playgroud)

Luc*_*tti 7

有两个问题:

1.可用的初始化

convenience initializer你的呼唤中failable initializer.那么如何保证UIImage在依赖于某个实例时始终创建实例failable initializer,根据定义,并不能保证?你可以通过!在调用时使用魔法来解决这个问题failable init.

2.参考你收到的参数

当你打电话时,self.init你没有传递你的init中收到的参数.而是引用枚举定义.要解决此问题,请更换此项

self.init(named: AssetIdentifier.RawValue)
Run Code Online (Sandbox Code Playgroud)

有了这个

self.init(named: assetIdentifier.rawValue)
Run Code Online (Sandbox Code Playgroud)

包起来

这是结果

extension UIImage {
    enum AssetIdentifier: String {
        case Search = "Search"
        case Menu = "Menu"
    }
    convenience init(assetIdentifier: AssetIdentifier) {
        self.init(named: assetIdentifier.rawValue)!
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

UIImage(assetIdentifier: .Search)
Run Code Online (Sandbox Code Playgroud)

  • @CodyWeaver:如果您认为答案是正确的,请不要忘记接受答案。 (2认同)