J'ai un framework iOS que je suis en train de passer à Swift 3. J'aimerais que les signatures de méthodes de l'API suivent les conventions de Swift 3 en utilisant un premier paramètre nommé pour les méthodes tout en conservant la rétrocompatibilité. Il est assez facile d'ajouter de nouvelles signatures de méthode API et de déprécier les anciennes. Mais quelle est la meilleure façon de gérer cela avec les protocoles utilisés par les délégués?Mise à niveau des protocoles obsolètes pour la mise à niveau de Swift 3
API pour 2.x Swift:
@objc(FooManager)
public class FooManager {
public var delegate: FooManagerDelegate?
public func saveFoo(foo: Foo) {
...
delegate?.didSaveFoo(foo)
}
...
}
@objc public protocol FooManagerDelegate {
@objc optional func didSaveFoo(foo: Foo)
}
Nouvelle API pour 3.x Swift:
@objc(FooManager)
public class FooManager {
public var delegate: FooManagerDelegate?
@available(*, deprecated, message: "use didSave(foo: foo)")
public func saveFoo(foo: Foo) {
...
delegate?.didSaveFoo(foo)
}
public func save(foo: Foo) {
...
delegate?.didSave(foo: foo)
}
...
}
@objc public protocol FooManagerDelegate {
@objc optional func didSaveFoo(foo: Foo)
@objc optional func didSave(foo: Foo)
}
La solution ci-dessus fonctionnera, mais il ne donnera aucun avertissement de désapprobation à utilisateurs pour continuer à utiliser les anciennes méthodes de délégué. Je pourrais créer un nouveau délégué et déprécier l'ancienne classe de délégué, mais je finirais par avoir une classe de délégué et un nom de propriété non standard. Je ne voudrais pas que mon FooManager laid regarder comme ceci:
public class FooManager {
@available(*, deprecated, message: "use swift3delegate")
public var delegate: FooDelegate?
public var swift3delegate: Swift3FooDelegate?
Y at-il des meilleures solutions pour les utilisateurs migrer vers de nouvelles signatures de méthode de protocole, tout en maintenant la compatibilité ascendante?
Merci,: en utilisant un protocole de base sans la méthode désapprouvée pourrait rendre ce un peu moins maladroit, mais il est une jolie solution passe-partout lourde à coup sûr. De cette façon, j'ai seulement besoin d'une propriété 'delegate' dans la classe manager. Je souhaite juste ne pas avoir à faire un nouveau protocole avec un nom drôle - mon protocole Swift 2 a le nom que je veux utiliser. :( – davidgyoung
Si votre propre code est la seule implémentation du protocole par exemple dans la même cible/projet/espace de travail (ie dans un paramètre qui serait simple à rechercher et remplacer), vous pouvez toujours le renommer comme "... Legacy " ou quelque chose.Mais oui, je ne peux pas dire que je suis excité par cette solution de contournement d'une autre manière que cela, il isole soigneusement les choses obsolètes dans une unité (le protocole avec juste des choses obsolètes). – mz2