3

Я пытаюсь сделать что-то вроде этого:Как вернуть пользовательский объект в быстрый инициализатор удобства?

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

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image // <- impossible 
    } 
} 

Но это невозможно, так как «ноль» является единственным правильным возвращением для инициализатора ... Как мне это сделать?

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

ответ

4

Что вы хотите - это метод фабрики класса, а не инициализатор. Большинство методов завода в Фонде/какао автоматически мостик инициализаторы, но если то, что вы хотите, не может быть сделано с помощью init, вы можете добавить новый метод класса:

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

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image 
    } 
} 
+0

это немного грустно, что вы не можете вернуть другой объект в Свифт. У меня есть эта структура с этим сложным контроллером просмотра, определенным в раскадровке. Я хотел бы иметь возможность переопределить 'init()' или даже создать собственный инициализатор, чтобы программно создать экземпляр диспетчера представлений и настроить его все с помощью его представлений/выходов и т. Д. Но единственный способ - использовать заводский метод. , –

1

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

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% к коду, но в основном суть его