Hola, me llamo Luis y en esta ocasión les traigo este nuevo artículo.
Índice
Explore Kotlin y Swift juntos y aprenda sus diferencias
El primer principio es el SÓLIDO, el segundo es el Principio de apertura y cierre, es decir, Abrir para extensión y Cerrar para modificación. Tanto Kotlin como Swift tienen la capacidad de extenderse a una clase además de su capacidad para la herencia de objetos.
La extensión
Aunque tanto Kotlin como Swift tienen extensiones, son diferentes.
Kotlin tiene extensión de función
class MyClass {} fun MyClass.extensionFunction() {}
Swift tiene extensión de clase
class MyClass {} extension MyClass { func extensionFunction() {} }
Si bien ambos pueden parecer similares, difieren en capacidades. A continuación, comparto las ventajas de cada uno.
La extensión de la función
En Kotlin, solo tienes soporte de extensión de función. Además de extender una función a una clase, a continuación se muestran sus ventajas en comparación con la extensión de clase
Función de extensión del receptor anulable
Además de extender una función en una clase normal, la función de extensión en Kotlin también se puede extender en un objeto de clase anulable.
class MyClass { val localVal = "aaa" fun doSomething() { println("Normal doSomething") } } fun MyClass?.doSomething() { if (this == null) println("Null doSomething") else doSomething() }
Esto permite que un tipo nulo del objeto de clase también pueda acceder a la función.
Función de extensión genérica
Otra cosa interesante de Function Extension es la capacidad de extenderse desde una plantilla genérica.
fun <T> T.strLen() { println(toString().length) }
Lo anterior se puede aplicar para aplicar el objeto para obtener la Cadena e imprimir la longitud. Esta capacidad es la que habilita la función de alcance en Kotlin, por ejemplo, el famoso let
public inline fun <T, R> T.let(block: (T) -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block(this) }
Extienda dentro de la clase para acceder a ambos ámbitos
Se puede declarar una función de extensión de otra clase dentro de una clase.
class MyClass { val myClassLocalVariable = "myClassLocalVariable" fun doSomething() { println("Normal doSomething") } } class WrapperClass { private val wrapperLocalVariable = "wrapperLocalVariable" fun MyClass.printBoth() { println("$wrapperLocalVariable $myClassLocalVariable") } }
Esto hace que el printBoth
función de extensión para tener acceso tanto a la variable de WrapperClass
y MyClass
.
A tener en cuenta: Solo se puede acceder al public
variable de MyClass
, que es una limitación de la extensión de la función, que se describirá a continuación.
La extensión de la clase
En Swift, solo tienes soporte de extensión de clase. A continuación se muestra la ventaja de la ventaja de clase que tiene Swift sobre la extensión de función que tiene Kotlin.
Acceso a variable privada
Con la extensión de clase, se considera parte de la clase. Por lo tanto, con eso, el alcance de la clase extendido puede acceder a los miembros privados de la clase.
class MyClass { private let localVal = "localVal" } extension MyClass { func printLocalVal() { print(localVal) } }
Esto hace que la función extendida dentro de la clase extendida pueda realizar lo que posiblemente puede hacer una función normal en la clase.
Definir un nuevo constructor
Usando la extensión de clase, podemos crear constructores adicionales específicos para la necesidad del módulo de llamada
class SinkClass { var sinkLocalVal: String init(sinkInitVal: String) { self.sinkLocalVal = sinkInitVal } }class SourceClass { var sourceLocalVal: String init(sourceInitVal: String) { self.sourceLocalVal = sourceInitVal } }extension SinkClass { convenience init(sourceObj: SourceClass) { self.init(initVal: sourceObj.localVal) } }let source = SourceClass(sinkInitVal: "xxx") let sink = SinkClass(sourceObj: source)
Usando este enfoque, tenemos un código más limpio al convertir un objeto de clase en el otro.
Implementar otro protocolo
Otro aspecto interesante de Class Extension es la posibilidad de que la clase existente implemente otro protocolo (o interfaz en el término de Kotlin).
final class MyClass { } protocol MyProtocol { } extension MyClass: MyProtocol { } func doSomething(myProtocol: MyProtocol) { } let myObj = MyClass() doSomething(myProtocol: myObj)
Consulte el código anterior, claramente MyClass
es final y no se puede heredar. Pero con la extensión de clase, aún podemos lograr que se ajuste a la MyProtocol
y ser utilizado como MyProtocol
y pasándolo al doSomething
función.
Esto será especialmente útil si MyClass
no es una clase de nuestra propiedad.
Hay otras partes interesantes de la función de extensión de clase en Swift, como mutaciones , suscripciones y tipos anidados , consulte aquí . Sin embargo, no los he visto usar tanto.
Resumen
La extensión de función y la extensión de clase pueden extenderse desde la clase existente creando funciones más útiles para esa clase, pero difieren en general como se muestra a continuación.
Espero que le sea de utilidad.
Añadir comentario