2014-06-13 8 views
10

mam przepisywanie kategorię Objective C poniżej Swift:obchodzenia Błąd inicjalizacji klasy w rozszerzeniu Swift

@implementation UIImage (Extra) 

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

Ten pyta być realizowane jako init, wygody, ale w jaki sposób mogę sprawdzić, czy wyznaczone initializer self.init (nazwany :) odnosi sukcesy?

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

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

Gdy wywołanie self.init (nazwane :) nie powiedzie się, init rozszerzenia przestaje wykonywać.

Próbowałem już utworzyć instancję UIImage i przypisuję ją sobie, ale to się nie kompiluje.

oczywiście metoda pomocnika może być używany jak w wersji objc:

extension UIImage { 

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

Ale czy istnieje sposób aby zaimplementować to przy użyciu inicjatora?

Odpowiedz

7

Możesz teraz tworzyć failable initializers w rozszerzeniach; jednak inicjalizatorów nie można zdefiniować w protokole.

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 
0

chciałbym napisać metodę jak poniżej:

extension UIImage { 

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

w Swift można wykorzystać składniki ewentualne. Jeśli tutaj nie ma obrazu o podanej nazwie, metoda zwróci zero.

3

W przeciwieństwie do Objective-C, inicjatory Swift nie zwracają self, więc sprawdzenie błędów inicjalizacji nie jest możliwe. Apple engineer suggested użyciu metody fabryki z opcjonalnym typ zwracany zamiast:

class ImageFactory { 

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

Inżynier Jabłko wskazano, że pracują na budowie coś w języku, który będzie obejść stosując metody klasy fabryki.

+2

Dlaczego warto zwrócić wartość opcjonalną, jeśli funkcja została zaprojektowana tak, aby nigdy nie zwracać 'nil'? – nschum

Powiązane problemy