处理Swift扩展中的类初始化失败 [英] Handling class initialization failure in Swift extension

查看:144
本文介绍了处理Swift扩展中的类初始化失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将下面的Objective C类别重写为Swift:

I'm rewriting an Objective C category below to 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(命名:)成功?

This asks to be implemented as an convenience init, but how can I check if designated initializer self.init(named:) succeeds?

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

        // need to assert here if self.init fails
    }

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

When self.init(named:) call fails, extension's init stops executing.

我'尝试创建一个UIImage实例并将其分配给self,但这不能编译。

I've tried creating an UIImage instance and assigning it to self, but this doesn't compile.

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

Of course, a helper method can be used like in ObjC version:

extension UIImage {

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

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

But is there a way to implement this using an initializer?

推荐答案

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

You can now create failable initializers in extensions; however, the initializers can not be defined in a protocol.

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

这篇关于处理Swift扩展中的类初始化失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆