protocolMeh{func doSomething();}//Extend protocol Meh, where `Self` is of type `UIViewController`
//func blah() will only exist for classes that inherit `UIViewController`.
//In fact, this entire extension only exists for `UIViewController` subclasses.
extensionMeh where Self:UIViewController{func blah(){
print("Blah");}func foo(){
print("Foo");}}classFoo:UIViewController,Meh{//This compiles and since Foo is a `UIViewController` subclass, it has access to all of `Meh` extension functions and `Meh` itself. IE: `doSomething, blah, foo`.
func doSomething(){
print("Do Something");}}classObj:NSObject,Meh{//While this compiles, it won't have access to any of `Meh` extension functions. It only has access to `Meh.doSomething()`.
func doSomething(){
print("Do Something");}}
Ci-dessous donnera une erreur de compilation, car Obj n'ont pas accès à Meh fonctions d'extension.
let i =Obj();
i.blah();
Mais la ci-dessous.
let j =Foo();
j.blah();
En d'autres termes, Meh.blah() est uniquement disponible pour les classes de type UIViewController.
Pourquoi les gens utilisent le même nom de Meh pour protocol Meh et extension Meh where Self: UIViewController, il semble confus pour moi. Parce que l'extension est en fait une extension sur ce protocole et non pas sur une classe elle-même.. mais seulement lorsqu'un UIViewController la met en œuvre.
Voici un exemple qui explique que ce qui est l'utilisation de l'auto: UIViewController
protocolSBIdentifiable{staticvar sbIdentifier:String{get}}extensionSBIdentifiable where Self:UIViewController{staticvar sbIdentifier:String{returnString(describing:self)}}extensionUIVieWcontroller:SBIdentifiable{}classViewController:UIViewController{func loadView(){/*Below line we are using the sbIdentifier which will return the
ViewController class name.
and same name we would mentioned inside ViewController
storyboard ID. So that we do not need to write the identifier everytime.
So here where Self: UIViewController means it will only conform the protocol of type UIViewController*/let viewController =self.instantiateViewController(withIdentifier:self.sbIdentifier)as?SomeBiewController}}
La clause where à ajouter une condition de l'extension, de sorte que l'extension ajoute la isTop(_:) méthode uniquement lorsque les éléments de la pile sont equatable.
Que la syntaxe est: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521
Considérer:
Ci-dessous donnera une erreur de compilation, car Obj n'ont pas accès à Meh fonctions d'extension.
Mais la ci-dessous.
En d'autres termes,
Meh.blah()
est uniquement disponible pour les classes de typeUIViewController
.Meh
pourprotocol Meh
etextension Meh where Self: UIViewController
, il semble confus pour moi.Parce que l'extension est en fait une extension sur ce protocole et non pas sur une classe elle-même.. mais seulement lorsqu'un
UIViewController
la met en œuvre.OriginalL'auteur Brandon
Voici un exemple qui explique que ce qui est l'utilisation de l'auto: UIViewController
OriginalL'auteur Hussain Shabbir
Vous pouvez trouver le même exemple ici: WWDC2015-408, (recommande Fortement de le regarder,il illustre la raison)
Et aussi, un autre exemple similaire est Extensions avec un Générique Clause where
La clause where à ajouter une condition de l'extension, de sorte que l'extension ajoute la isTop(_:) méthode uniquement lorsque les éléments de la pile sont equatable.
OriginalL'auteur boog