Search code examples
iosuiimageinitializationoverridingsubclassing

overriding UIImage(named: )


I was on my way to override UIImage class method init(named:). My goal is to be able to retrieve the file name of an image.

The code would look like this:

class UIImageWithFileName: UIImage {

    let fileName: String

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

This code seems to be impossible for following reasons.

I created a subclass of UIImage, started typing init... and to my surprise there was no init(named:) method to override. Here is a complete list of init methods:

enter image description here

enter image description here

How does one override UIImage init(named:)


Solution

  • Turns out that "init(named:" is explicitly not inheritable.

    If you look at the UIImage definition, you'll see this:

    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?)
    

    Which means you need to resolve or open the file yourself and pass in the raw data into the super class.