在Swift扩展中处理类初始化失败

我正在重写一个Objective C类别到Swift:

@implementation UIImage (Extra) + (UIImage *)validImageNamed:(NSString *)name { UIImage *image = [self imageNamed:name]; NSAssert(image, @"Unable to find image named '%@'", name); return image; } 

这要求作为一个方便的初始化,但我怎么能检查指定的初始化self.init(命名:)成功?

 extension UIImage { convenience init(validateAndLoad name: String!) { self.init(named: name) // need to assert here if self.init fails } 

当self.init(named :)调用失败时,扩展的init将停止执行。

我已经尝试创build一个UIImage实例并将其分配给自己,但是这不能编译。

当然,在ObjC版本中可以使用一个辅助方法:

 extension UIImage { class func validImage(named name: String) -> UIImage { var image = UIImage(named: name) assert(image == nil, "Image doesn't exist") return image } 

但有没有一种方法来实现这个使用初始化?

您现在可以在扩展中创build可分解的初始化程序; 但是,初始化程序不能在协议中定义。

 class Thing { var text:String? } extension Thing { convenience init?(text:String) { self.init() if text == "" { return nil } else { self.text = text } } } let that = Thing(text: "Hello") println(that?.text) //prints Optional("Hello") let empty = Thing(text: "") println(empty) //prints nil 

与Objective-C不同的是,Swift初始化器不返回self,所以检查初始化失败是不可能的。 一位苹果工程师build议使用具有可选返回types的工厂方法:

 class ImageFactory { class func validImage(named name: String) -> UIImage? { var image = UIImage(named:name) assert(image != nil, "fail") return image; } } 

苹果公司的工程师表示,他们正在努力将这些东西融入使用工厂级方法的语言中。

我会写如下的方法:

 extension UIImage { class func validImage(named name: String) -> UIImage? { var image = UIImage(named: name) return image } 

在迅速您可以使用可选项。 如果这里没有给定的名字的图像,该方法将返回零。