如何在swift方便初始值设定项中返回自定义对象?
问题描述:
我试图做这样的事情:如何在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 :)。
答
你想要的是类工厂方法,而不是初始化方法。在基础/可可大多数工厂方法将自动桥接初始化,但如果你想要的东西无法通过init
做,你可以添加一个新的类方法:因为你是返回一个新的对象
public extension UIImage {
class func imageWithWhatever(whatever: Int) -> UIImage {
UIGraphicsBeginImageContextWithOptions(...)
//...
let image = UIGraphicsGetImageFromCurrentContext()
UIGraphicsEndImageContext()
return image
}
}
答
这是,而不是自我。初始化的关键是要建立你的对象,而不是一个新的结构,所以如果你想这样做是为了方便初始化,你需要做的是这样的:
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%的代码,但是这基本上是它的要点
这是一个有点伤心你不能在Swift中返回一个不同的对象。我有这个框架,在故事板中定义了这个复杂的视图控制器。我想能够覆盖'init()'甚至创建一个自定义的初始化程序来以编程方式实例化视图控制器,并使用它的子视图/插口等来设置它。但唯一的方法是使用工厂方法.. 。 –