Как вернуть пользовательский объект в быстрый инициализатор удобства?
Я пытаюсь сделать что-то вроде этого:
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% код, но это в основном суть