En Objective-C, il est possible de spécifier une classe conforme à un protocole en tant que paramètre de méthode. Par exemple, je pourrais avoir une méthode qui n'autorise qu'un UIViewController
qui est conforme à UITableViewDataSource
:
- (void)foo:(UIViewController<UITableViewDataSource> *)vc;
Je ne trouve pas de moyen de faire cela dans Swift (ce n'est peut-être pas encore possible). Vous pouvez spécifier plusieurs protocoles en utilisant func foo(obj: protocol<P1, P2>)
, mais comment exigez-vous que l'objet appartienne également à une classe particulière?
Réponses:
Vous pouvez définir
foo
comme fonction générique et utiliser des contraintes de type pour exiger à la fois une classe et un protocole.Swift 4
Swift 3 (fonctionne également pour Swift 4)
Swift 2
la source
protocol<>
fournit (maisprotocol<>
ne peut pas contenir de types sans protocole).numberOfSectionsInTableView
parce que c'est une fonction obligatoireUITableViewDataSource
?numberOfSectionsInTableView:
est facultatif - vous pensez peut-êtretableView:numberOfRowsInSection:
.func foo<T: UIViewController>(vc:T) where T:UITableViewDataSource { ... }
Dans Swift 4, vous pouvez y parvenir avec le nouveau signe &:
la source
La documentation du livre Swift suggère d'utiliser des contraintes de type avec une clause where:
Cela garantit que «inParam» est de type «SomeClass» à condition qu'il adhère également à «SomeProtocol». Vous avez même le pouvoir de spécifier plusieurs clauses where délimitées par une virgule:
la source
Avec Swift 3, vous pouvez effectuer les opérations suivantes:
la source
Qu'en est-il de cette façon?:
la source
Swift 5:
Donc essentiellement la réponse de Jeroen ci-dessus.
la source
Remarque en septembre 2015 : il s'agissait d'une observation aux débuts de Swift.
Cela semble impossible. Apple a également cette gêne dans certaines de ses API. Voici un exemple d'une classe nouvellement introduite dans iOS 8 (à partir de la version bêta 5):
UIInputViewController
de »textDocumentProxy
biens:Défini dans Objective-C comme suit:
et dans Swift:
Lien vers la documentation Apple: https://developer.apple.com/library/prerelease/iOS/documentation/UIKit/Reference/UIInputViewController_Class/index.html#//apple_ref/occ/instp/UIInputViewController/textDocumentProxy
la source
var textDocumentProxy: UITextDocumentProxy! { get }
@protocol MyAwesomeCallbacks <NSObject>