2014-06-13 14 views
10

ich eine Objective C Kategorie unten zu Swift bin Umschreiben:Handhabung Klasseninitialisierung Ausfall in Swift Erweiterung

@implementation UIImage (Extra) 

+ (UIImage *)validImageNamed:(NSString *)name 
{ 
    UIImage *image = [self imageNamed:name]; 
    NSAssert(image, @"Unable to find image named '%@'", name); 
    return image; 
} 

Dies fragt als Bequemlichkeit init umgesetzt werden, aber wie kann ich überprüfen, ob bezeichnet initializer self.init (benannt :) gelingt?

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

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

Wenn der Aufruf von self.init (named :) fehlschlägt, wird die Ausführung der Erweiterung init beendet.

Ich habe versucht, eine UIImage-Instanz erstellen und es zum Selbst zuweisen, aber das nicht kompiliert.

Natürlich kann eine Hilfsmethode wie in ObjC Version verwendet werden:

extension UIImage { 

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

Aber gibt es eine Möglichkeit, dies mit einem Initialisierer zu implementieren?

Antwort

7

Sie jetzt failable initializers in Erweiterungen erstellen können; Initialisierer können jedoch nicht in einem Protokoll definiert werden.

0

ich würde das Verfahren wie unten schreiben:

extension UIImage { 

class func validImage(named name: String) -> UIImage? { 
    var image = UIImage(named: name) 
    return image 
} 

in swift Sie optionals verwenden können. Wenn hier kein Bild mit dem angegebenen Namen ist, gibt die Methode nil zurück.

3

Im Gegensatz zu Objective-C, Swift initializers kehrt nicht selbst, so die Überprüfung für die Initialisierung Ausfälle ist nicht möglich. Ein Apple engineer suggested eine Factory-Methode mit einem optionalen Rückgabetyp anstelle:

class ImageFactory { 

    class func validImage(named name: String) -> UIImage? 
    { 
     var image = UIImage(named:name) 
     assert(image != nil, "fail") 
     return image; 
    } 
} 

Der Apple-Ingenieur an, dass sie sich auf dem Aufbau etwas in die Sprache arbeiten, die unter Verwendung von Factory-Klasse Methoden umgehen.

+2

Warum ein optionales zurückgeben, wenn die Funktion niemals 'nil' zurückgibt? – nschum

Verwandte Themen