web-dev-qa-db-fra.com

Distinction entre Swift majuscule et "self" minuscule

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?

57
Eray Diler

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.

64
Rob Napier

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
  }
}
5
Devesh

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
3
ukim

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.

1
Neeraj Khede