structs protocol constructors swift self

protocol - structs in swift



Distinción en Swift entre mayúsculas "Self" y minúsculas "self" (5)

Mientras jugaba en un patio de juegos Swift, noté que Self , con mayúscula "S", está disponible junto con el self minúsculas. ¿Hay alguna diferencia entre ellos? Si es así, ¿cuáles son los usos para estos dos, especialmente para el Self ?


Entiendo Self como un nombre de tipo (nombre de clase, por ejemplo) y self como una instancia de una clase / estructura, por ejemplo:

struct Person { static var documentNumner = "9484930" var name: String var computedFullName: String { return ("/(self.name) with document number: /(Self.documentNumner)") } }

No puede usar self con una propiedad estática, pero puede usar Self


Self también se puede utilizar 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 tipos con "as" Por favor vea el ejemplo a continuación:

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 el protocolo.


en protocolo y declaración de extensión, use Self else self

extension protocolName where Self: UIView { func someFunction() { self.layer.shadowColor = UIColor.red.cgColor } }


Self refiere al tipo de "cosa" actual dentro de un protocolo (lo que sea que se ajuste al protocolo). Para ver un ejemplo de su uso, vea Protocol func return Self .

Los documentos oficiales que encontré para Self están en la Declaración de tipo asociada al protocolo en The Swift Programming Language. Sorprendentemente, no está documentado en las secciones sobre protocolos o sobre tipos anidados:

Sin embargo, ahora hay un párrafo sobre Self Type incluye un ejemplo de código en el capítulo oficial del Swift Programming Language sobre Tipos


Self también se puede usar en clases, y es útil. Here hay un artículo al respecto.

Aquí hay un ejemplo. Tienes una clase llamada MyClass . MyClass tiene métodos que devuelven instancias del mismo. Ahora agrega una subclase de MyClass llamada MySubclass . Desea que estos métodos devuelvan instancias de MySubclass 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)

Se imprime la siguiente línea:

// Created // modifid: Created // MySubclass Created // MySubclass modifid: MySubclass Created