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