Distinción en Swift entre "Yo" mayúscula y " yo " minúscula"


Mientras jugaba en un patio de juegos Rápido me di cuenta de que Self, con "S" mayúscula, está disponible junto con la minúscula self. Hay alguna diferencia entre ellos? Si es así, ¿cuáles son los usos para estos dos, especialmente para Self?

 52
Author: Josh Caswell, 2015-01-09

4 answers

Self se refiere al tipo de la "cosa" actual dentro de un protocolo (lo que se ajusta al protocolo). Para un ejemplo de su uso, ver Protocolo func returning Self .

Los únicos documentos oficiales que he encontrado para Self están en Declaración de Tipos Asociados al Protocolo en el Lenguaje de Programación Swift. Sorprendentemente, no está documentado en las secciones sobre protocolos o tipos anidados.

 57
Author: Rob Napier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:27

En la declaración de protocolo y extensión use Self else self

extension protocolName where Self: UIView 
{
  func someFunction()
  {
    self.layer.shadowColor = UIColor.red.cgColor
  }
}
 5
Author: Devesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-10 12:55:56

Self también se puede utilizar en clases, y es útil. Aquí hay un artículo sobre esto.

Aquí hay un ejemplo. Tienes una clase llamada MyClass. MyClass tienen métodos que devuelven instancias del mismo. Ahora agregas una subclase de MyClass llamada MySubclass. Desea que estos métodos devuelvan instancias de MySubclass en lugar de MyClass. El siguiente código muestra cómo hacerlo. Tenga en cuenta que los métodos pueden ser métodos de instancia o métodos de clase.

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 siguiente línea impresa:

// Created
// modifid: Created
// MySubclass Created
// MySubclass modifid: MySubclass Created
 3
Author: ukim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-10 19:36:13

Self también se puede usar como un tipo de retorno en el cuerpo del método de extensión de protocolo que devolverá la instancia de tipo de confirmación, y para la conversión de tipo con "as". Por favor vea el siguiente ejemplo:

extension <Protocol-Name> where Self:<Class-Name> {
static func foo(_ param:Type)-> Self{
    guard let abc = method() as? Self else{
        return xyz
    }
}}

En pocas palabras, Self se puede usar para referir el Tipo que confirma al protocolo.

 1
Author: Neeraj Khede,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-04 04:42:48