/ / Swift - Comment remplacer une fonction init? (Était une catégorie dans Objective-C) - swift, uistoryboard, category, init

Swift - Comment remplacer une fonction init? (Était une catégorie dans Objective-C) - swift, uistoryboard, category, init

j'ai un Objectif c catégorie utilisée pour personnaliser

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

Il est utilisé pour déterminer le fichier de storyboard à appeler lorsque vous utilisez plusieurs périphériques. Maintenant, je dois le changer en Swift.

Il semble que je dois créer un "Extension rapide", mais j'ai du mal à le faire fonctionner.

Voici ce que j'ai

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!)
}
}

Réponses:

1 pour la réponse № 1

Vous ne pouvez pas remplacer une méthode Swift dans une extension. Voir la documentation sur les extensions pour référence.

Vous ne pouvez pas utiliser d'extensions pour remplacer des méthodes ou des propriétés existantes sur des types Objective-C.

Vous avez également utilisé la mauvaise signature. La signature correcte est

init(name: String, bundle: NSBundle?)

Cela vous permettra de créer la commoditéinitializer, et il l’utilisera lorsque vous l’appellerez dans votre propre code, mais l’implémentation du framework sera appelée à partir de code externe. Il me semble qu’un bogue me permettra de déclarer un initialiseur de commodité d’extension avec le même nom , comme je ne peux pas "trouver le moyen d’appeler l’initialiseur d’origine, vous obtiendrez une récursion infinie comme vous l’avez écrit."