微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在为 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

原文地址:https://www.jb51.cc/iOS/329880.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐