我正在为
Swift重写一个目标C类别:
@implementation UIImage (Extra) + (UIImage *)validImageNamed:(NSString *)name { UIImage *image = [self imageNamed:name]; NSAssert(image,@"Unable to find image named '%@'",name); return image; }
这要求实现为一个方便的init,但是如何检查指定的初始化程序self.init(命名:)成功?
extension UIImage { convenience init(validateAndLoad name: String!) { self.init(named: name) // need to assert here if self.init fails }
当self.init(命名:)调用失败时,extension的init将停止执行.
我已经尝试创建一个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 }
但是有没有办法使用初始化程序来实现?
解决方法
您现在可以在扩展中创建
failable initializers;然而,初始化器不能在协议中定义.
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