/ / Swift - Jak zastąpić funkcję init? (Był kategorią w Objective-C) - szybki, uistoryboard, category, init

Swift - Jak zastąpić funkcję init? (Był kategorią w Objective-C) - szybki, uistoryboard, category, init

mam Cel C kategoria używana do dostosowania

UIStoryboard"s "+ (UIStoryboard *)storyboardWithName:(NSString *)name".

Służy do określenia, który plik scenorysu należy wywołać, gdy ma do czynienia z wieloma urządzeniami. Teraz muszę go zmienić na Swift.

Wydaje się, że muszę stworzyć "Rozszerzenie Swift", ale mam problemy z uruchomieniem go.

Oto co mam:

extension UIStoryboard {
convenience init(name: String, storyboardBundleOrNil: NSBundle?)
{
var storyboard: UIStoryboard?
var storyboardName: String?

// Don"t adjust name if it"s universal storyboard (Xcode 6, iOS 8)
storyboardName = name;

if (name.rangeOfString("_Universal") == nil)
{
if (UIDevice.currentDevice().userInterfaceIdiom == .Pad)
{
storyboardName = storyboardName!+"_iPad"
}
else
{
storyboardName = storyboardName!+"_iPhone"
}
}
//        storyboard = UIStoryboard(name: storyboardName!, storyboardBundleOrNil: storyboardBundleOrNil!)
assert(storyboard != nil, "Storyboard %@ not found!")
//return storyboard!;
self.init(name: storyboardName!, storyboardBundleOrNil: storyboardBundleOrNil!)
}
}

Odpowiedzi:

1 dla odpowiedzi № 1

Nie można zastąpić metody Swift w rozszerzeniu. Zobacz dokumentację na temat rozszerzeń w celach informacyjnych.

Nie można używać rozszerzeń do nadpisywania istniejących metod lub właściwości w typach Objective-C.

Użyłeś również niewłaściwego podpisu

init(name: String, bundle: NSBundle?)

Pozwoli ci to stworzyć wygodęinicjalizator i użyje go, gdy wywołasz go w swoim własnym kodzie, ale implementacja tego frameworka zostanie wywołana z zewnętrznego kodu. Wydaje mi się, że jest to błąd, który pozwoli Ci zadeklarować rozszerzenie inicjalizatora wygody o tej samej nazwie , ponieważ nie mogę znaleźć sposobu na wywołanie oryginalnego inicjalizatora, więc otrzymasz nieskończoną rekursję w sposób, w jaki ją napisałeś.