Ошибка инициализации класса обработки в расширении 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;
}
Это запрашивает реализацию в качестве удобства init, но как я могу проверить, назначен ли сам инициализатор.init (named:) преуспевает?
extension UIImage {
    convenience init(validateAndLoad name: String!) {
        self.init(named: name)
        // need to assert here if self.init fails
    }
при себе.вызов init(named:) завершается ошибкой, инициализация расширения прекращается.
Я попытался создать экземпляр 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
    }
но есть ли способ реализовать это с помощью инициализатора?
3 ответов
теперь вы можете создать failable инициализаторы в расширениях; однако инициализаторы не могут быть определены в протоколе.
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, поэтому проверка сбоев инициализации невозможна. Ан Apple инженер предложил использование заводского метода с дополнительным типом возврата вместо:
class ImageFactory {
    class func validImage(named name: String) -> UIImage? 
    {
        var image = UIImage(named:name)
        assert(image != nil, "fail")
        return image;
    }
}
инженер Apple указал, что они работают над созданием чего-то на языке, который будет распространяться с использованием методов Заводского класса.
Я бы написал метод, как показано ниже:
extension UIImage {
class func validImage(named name: String) -> UIImage? {
    var image = UIImage(named: name)
    return image
}
в swift вы можете использовать optionals. Если нет изображения с заданным именем метод вернет nil.