Как вернуть пользовательский объект в быстрый инициализатор удобства?

Я пытаюсь сделать что-то вроде этого:

public extension UIImage {
    public convenience init(whatever: Int) {
        UIGraphicsBeginImageContextWithOptions(...)

        //...

        let image = UIGraphicsGetImageFromCurrentContext()
        UIGraphicsEndImageContext()

        return image // <- impossible
    }
}

Но это невозможно, так как "nil" - единственное допустимое возвращение для инициализатора... Как мне это сделать?

Например, метод Objtive-C [UIImage imageNamed:] является методом класса (который может возвращать все, что он хочет в Objective-C), и он был сопоставлен с быстрым инициализатором UIImage(named:).

2 ответа

Вам нужен метод фабрики классов, а не инициализатор. Большинство фабричных методов в Foundation/Cocoa автоматически соединяются с инициализаторами, но если то, что вы хотите, не может быть сделано через initВы можете добавить новый метод класса:

public extension UIImage {
    class func imageWithWhatever(whatever: Int) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(...)

        //...

        let image = UIGraphicsGetImageFromCurrentContext()
        UIGraphicsEndImageContext()

        return image
    }
}

Это потому, что вы возвращаете новый объект, а не себя. Смысл init заключается в том, чтобы создать структуру вашего объекта, а не новый, поэтому, если вы хотите сделать это для удобства init, вам нужно сделать это следующим образом:

public extension UIImage {
    public convenience init(whatever: Int) {
        UIGraphicsBeginImageContextWithOptions(...)

        //...

        let image = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext());
        UIGraphicsEndImageContext()

        self.init(CGImage:image)
    }
}

возможно, вместо удобства инициализации, вы хотите создать функцию класса, которая делает то, что вы просите:

 public class func createImage(whatever: Int) {
    UIGraphicsBeginImageContextWithOptions(...)

//...

let image = UIGraphicsGetImageFromCurrentContext()
UIGraphicsEndImageContext()

return image 
}

Я прошу прощения, что это не 100% код, но это в основном суть

Другие вопросы по тегам