En jouant dans une aire de jeux Swift, j’ai remarqué que Self
, avec la majuscule "S", est disponible avec la minuscule self
. Y a-t-il une différence entre eux? Si oui, quels sont les usages pour ces deux-là, en particulier pour Self
?
Self
fait référence au type de la "chose" actuelle dans un protocole (tout ce qui est conforme au protocole). Pour un exemple d'utilisation, voir Fonction de protocole renvoyant Self .
Le seul document officiel que j'ai trouvé pour Self
est dans Déclaration de type associé au protocole dans le langage de programmation Swift. De manière surprenante, il n’est pas documenté dans les sections sur les protocoles ou sur les types imbriqués.
dans le protocole et la déclaration d'extension utilisez Self else self
extension protocolName where Self: UIView
{
func someFunction()
{
self.layer.shadowColor = UIColor.red.cgColor
}
}
Self
peut également être utilisé dans les classes et est utile. Ici est un article à ce sujet.
Voici un exemple. Vous avez une classe appelée MyClass
. MyClass
ont des méthodes qui en retournent des instances. Vous ajoutez maintenant une sous-classe de MyClass
appelée MySubclass
. Vous voulez que ces méthodes renvoient des instances de MySubclass
au lieu de MyClass
. Le code suivant montre comment faire. Notez que les méthodes peuvent être des méthodes d'instance ou des méthodes de classe.
class MyClass: CustomStringConvertible {
let text: String
// Use required to ensure subclasses also have this init method
required init(text: String) {
self.text = text
}
class func create() -> Self {
return self.init(text: "Created")
}
func modify() -> Self {
return type(of: self).init(text: "modifid: " + text)
}
var description: String {
return text
}
}
class MySubclass: MyClass {
required init(text: String) {
super.init(text: "MySubclass " + text)
}
}
let myClass = MyClass.create()
let myClassModified = myClass.modify()
let mySubclass = MySubclass.create()
let mySubclassModified = mySubclass.modify()
print(myClass)
print(myClassModified)
print(mySubclass)
print(mySubclassModified)
La ligne suivante imprimée:
// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
Self peut également être utilisé comme type de retour dans le corps de la méthode d'extension de protocole qui renverra l'instance de type de confirmation, et pour la conversion de type avec "as". Veuillez voir l'exemple ci-dessous:
extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
guard let abc = method() as? Self else{
return xyz
}
}}
En résumé, Self peut être utilisé pour renvoyer le type qui confirme le protocole.