3

我试图做这样的事情:如何在swift方便初始值设定项中返回自定义对象?

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

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image // <- impossible 
    } 
} 

但是,这是不可能的,因为“无”是一个初始化的唯一有效的回报......我该怎么办呢?例如,Objtive-C方法[UIImage imageNamed:]是一个类方法(它可以在Objective-C中返回任何它想要的),并将其映射到swift初始化程序UIImage(named :)。

回答

4

你想要的是类工厂方法,而不是初始化方法。在基础/可可大多数工厂方法将自动桥接初始化,但如果你想要的东西无法通过init做,你可以添加一个新的类方法:因为你是返回一个新的对象

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

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image 
    } 
} 
+0

这是一个有点伤心你不能在Swift中返回一个不同的对象。我有这个框架,在故事板中定义了这个复杂的视图控制器。我想能够覆盖'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%的代码,但是这基本上是它的要点

相关问题