Swift UIImage 扩展

问题描述 投票:0回答:3

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

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)'
ios image swift swift2 init
3个回答
10
投票

有2个问题:

1.初始化失败

在您的

convenience initializer
中,您正在调用
failable initializer
。那么,当您依赖于根据定义不能保证的
UIImage
时,如何保证始终创建
failable initializer
的实例呢? 您可以在调用
!
时使用魔法
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)

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


}

0
投票
extension UIImage {
    
    class var share: UIImage? {
        return .init(systemName: "square.and.arrow.up")
    }
    
}

用途:

var yourImage: UIImage = .share

navigationItem.rightBarButtonItem = UIBarButtonItem(image: .share, style: .plain, target: self, action: #selector(shareTap))
© www.soinside.com 2019 - 2024. All rights reserved.