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

Zme*_*mey 11 ios swift swift-extensions

我正在将下面的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;
}
Run Code Online (Sandbox Code Playgroud)

这要求作为一个方便的init实现,但是如何检查指定的初始化程序self.init(命名:)是否成功?

extension UIImage {
    convenience init(validateAndLoad name: String!) {
        self.init(named: name)

        // need to assert here if self.init fails
    }
Run Code Online (Sandbox Code Playgroud)

当self.init(named :)调用失败时,扩展的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
    }
Run Code Online (Sandbox Code Playgroud)

但有没有办法使用初始化程序实现这一点?

小智 7

您现在可以在扩展中创建可用的初始值设定项 ; 但是,初始化程序无法在协议中定义.

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
Run Code Online (Sandbox Code Playgroud)