覆盖 UIImage(命名为:)

overriding UIImage(named: )

我正在重写 UIImage class 方法 init(named:)。我的目标是能够检索图像的文件名。

代码如下所示:

class UIImageWithFileName: UIImage {

    let fileName: String

    override init(named:String){
        super.init(named)
    fileName = named
    }
}

由于以下原因,此代码似乎是不可能的。

我创建了一个 UIImage 的子class,开始输入 init... 令我惊讶的是没有 init(named:) 方法可以覆盖。以下是 init 方法的完整列表:

如何覆盖 UIImage init(named:)

原来“init(named:”是明确不可继承的。

如果您查看 UIImage 定义,您会看到:

public class UIImage : NSObject, NSSecureCoding, NSCoding {

    public /*not inherited*/ init?(named name: String) // load from main bundle

    @available(iOS 8.0, *)
    public /*not inherited*/ init?(named name: String, inBundle bundle: NSBundle?, compatibleWithTraitCollection traitCollection: UITraitCollection?)

也就是说需要自己解析或者打开文件,将原始数据传入super class.

这是一种解决方法:

class UIImageWithName: UIImage {

var fileName: String!

func ofFile(named:String) -> UIImageWithName?{
    let cgImage = UIImage(named: named)?.CGImage
    if let validName = cgImage{
        let image = UIImageWithName(CGImage: validName)
        image.fileName = named
        return image
    }
    return nil
}

}

不确定它是否有效或有任何争议。请反馈

我发现这个很好用。

class MyImage: UIImage {

    convenience init?(named name: String) {
        guard let image = UIImage(named: name),
            let cgImage = image.cgImage else {
                return nil
        }
        self.init(cgImage: cgImage)
    }

}