Categories
Articulo personal Swift Development

100 Días de Swift Día 10

Estas son mis notas para el curso https://www.hackingwithswift.com/100

Entrada anterior

“Any fool can write code that a computer can understand, but good programmers write code that humans can understand.”

Martin Fowler

«Cualquier tonto puede escribir código que una computadora pueda entender, pero buenos programadores pueden escribir código qué humanos pueden entender.»

Martin Fowler

Classes

Las clases son similares a las structs, te permiten nuevos tipos de datos, con propiedades y métodos.

Las clases tienen por lo menos cinco diferencias principales con las Clases

Creating your own classes

La primera es que las clases no vienen un un inicializador por default, siempre debes crearlo tú.

class Perro {
    var nombre: String
    var raza: String

    init(nombre: String, raza: String) {
        self.nombre = nombre
        self.raza = raza
    }
}

Crear instancias de una clase es igual que crear instancias de una estructura.

let cachorrito = perro(nombre: "Toby", raza: "Poodle")

Class inheritance

La segunda diferencia es que puedes crear una clase partir de otra clase ya existente, esto hereda todas las propiedades y métodos de la clase padre.

Por ejemplo creemos una clase en base a nuestra clase anterior Perro

class Sabueso: Perro {

}

Esta clase nueva hereda el inicializador y los parámetros de su clase padre

Aun así podemos crear un inicializador propio de Sabueso por ejemplo ya que sabemos que nuestro perro es un sabueso podemos iniciar nuestra clase sabueso solo con el nombre.

class Sabueso: Perro {
    
    init(nombre: String) {
        super.init(nombre: nombre, raza: "Sabueso")
    } 
}

Por razones de seguridad, swift siempre te pedirá llamar al «super.init» al crear una clase hija

let cazador = Sabueso(nombre: "Maylo")

Overriding methods

Las clases hijas pueden remplazar los métodos de sus padres con implementaciones propias.

Este proceso se conoce como «overriding»

Añadamos un método a nuestra clase Perro

class Perro {
    var nombre: String
    var raza: String

    init(nombre: String, raza: String) {
        self.nombre = nombre
        self.raza = raza
    }

 
}

Ahora podemos llamar este método desde cualquier instancia de su clase hija

cazador.ladrar()

Ahora podemos remplazar el método en nuestra clase hija para ponerle nuestra propia implementación.

Para eso usamos la palabra reservada «override» esto sire para evitar remplazar métodos por accidente.

 class Sabueso: Perro {
     
     init(nombre: String) {
         super.init(nombre: nombre, raza: "Sabueso")
     }

    override func ladrar() {
        print("¡Woolf! ¡Woolf! ¡Woolf!")
    }
 }
 
 let cazador = Sabueso(nombre: "Maylo")
cazador.ladrar()
// esto imprime "¡Woolf! ¡Woolf! ¡Woolf!"

Final classes

Sin bien la herencia es algo genial, no es algo que siempre queramos, por ejemplo si queremos marcar nuestras clases como finales y evitar que otros desarrolladores remplacen nuestros métodos solo debemos marcar la clase como final.

 final class Perro {
     var nombre: String
     var raza: String

     init(nombre: String, raza: String) {
         self.nombre = nombre
         self.raza = raza
     }
     
     func ladrar (){
         print("¡Guau! ¡Guau! ¡Guau!")
     }
 }
Cómo vemos eso impide la herencia.

Copying objects

La tercera diferencia entre clases y estructuras es lo que ocurre al copiarla

Al copiar una estructura, tanto la original como la copia son instancias diferentes, cambiar una no afecta la otra.

Cuando copias una clase, tanto la original como la copia son la misma, cambiar algo en una afecta a la otra.

let cachorrito = Perro(nombre: "Toby", raza: "Poodle")

let copiaDeCachorrito = cachorrito

copiaDeCachorrito.nombre = "Firulais"

print(cachorrito.nombre)

Al correr este código veras que al editar la copia de cachorrito también afecta al original. Esto ocurre por que ambas instancias apuntan al mismo espacio en al memoria

Deinitializers

La curta diferencia entre clases y estructuras es que las clases pueden tener «Deinitializers» código que se ejecuta cuando una instancia de la clase es destruida.

Para crear un Deinitializer usamos la palabra reservada «deinit»

class Chihuahua: Perro {
    init() {
        
        super.init(nombre: "Panchito", raza: "Chihuahua")
        print("¡Ahy ahy \(nombre) esta vivo!")
    }
    
    deinit {
        print("¡Ahy ahy 🤧😭 \(nombre) ya se murio!")
    }
}
 
for _ in 1...3 {
    let perro = Chihuahua()
}
Eso fue divertido

Mutability

La quinta y ultima diferencia entre clases y estructuras es la manera en como lidian con las constantes

En una estructura si tenemos una instancia que es una constante, y dentro de ella variables, la variable no puede ser cambiada pues toda la estructura es una constante.

Sin embargo en una clase si tenemos una instancia que es una constante y dentro tenemos una variable esta si que puede ser cambiada, por eso clases no necesitan mutating en sus métodos que cambian propiedades.

let perrito = Perro(nombre: "Toby", raza: "Callejero")
perrito.nombre = "Clifor"

print(perrito.nombre)

Si queremos evitar que esto pase debemos definir nuestra parámetro como una constante.

class Perro {
    //ahora ya no podrá ser cambiado
     let nombre: String
     var raza: String

     init(nombre: String, raza: String) {
         self.nombre = nombre
         self.raza = raza
     }
     
     func ladrar (){
         print("¡Guau! ¡Guau! ¡Guau!")
     }
  
 }

Resumen

Las clases y las estructuras son similares, ambas pueden crear tipos de datos personalizados, con sus propias propiedades y métodos

Las clases pueden heredar propiedades y métodos a otras, mediante un sistema de jerarquía llamado herencia en el cual creas clases a partir de otras

Puedes evitar la herencia marcando tu clase como final

El remplazo de métodos en una clase hija permite crear un remplazo del método de la clase padre con su propia implementación esto en POO se conoce como polimorfismo.

Cuando dos variables (o instancias) apuntan a la misma clase ambos comparten el mismo espacio de memoria, modificar una modifica a la otra.

Las clases tienen desinicializadores que es código que corre cuando una instancia de la clase es destruida.

Las clases aunque sean constantes pueden ser modificadas si alguna de sus propiedades es una variable.

//y bueno esas fueron mis notas para clases sin duda un tema super interesante y muy relacionado con POO

Referencias

https://www.hackingwithswift.com

https://www.hackingwithswift.com/100/10

Proximo día

Categories
Articulo personal CSS Web Development WordPress

Personalizando el CSS de WordPress Soporte para Modo Oscuro y Claro

Ahora que comienzo mi blog personal decidí usar WordPress mas que nada por que no tenia ganas por el momento de reinventar la rueda y lo cierto es que como blog funciona a la perfección.

Aun así algo es claro y eso es; que el estilo CSS del tema por defecto no coincide con el de mi pagina web principal por tanto me decidí a investigar como editar el estilo css del tema de WordPress y ademas darle soporte para modo oscuro.

Es mas fácil editar el estilo desde CSS adicional en Apariencia > Temas > Personalizar > CSS adicional pero hay que estar inspeccionando los elementos para encontrar las clases por lo que es más fácil editarlo directamente desde el archivo css principal.

Para comenzar encontré que es posible editar el CSS del tema en Apariencia > Editor de temas

Al parecer al Inicio hay un indice de lo que contiene el archivo CSS principal ya que el cero se supone que es para reiniciar el estilo vamos a dejarlo tal y como esta.

Así que comienzo añadiendo mis constantes de colores

:root {
  --blacklc: #141619;
  --blacktwo: #212228;
  --blackthree: #1d1d21;
  --greelc: #69baa0;
  --bluelc: #589b99; 
}

Ahora esto hace que me marque errores en el código pero los ignoraremos por ahora.

para que nuestro sitio se adapte al modo oscuro o claro del dispositivo del usuario añadiremos estas dos etiquetas

@media (prefers-color-scheme: dark) {
	body {
		background: var(--blacktwo);
	}
}

@media (prefers-color-scheme: light) { 
	body {
		background: var(--greelc);
	}
}

Como puede verse he añadido mis dos constantes de color como fondo solo para probar si esta funcionado, así que ahora solo hay que hacer click en el botón actualizar archivo y recargar el sitio sin cache.

Modo claro
Modo oscuro

Ademas de editar el archivo CSS fue necesario editar un archivo php así que trate de elegir un color que funcionara tanto en modo oscuro como claro.

Ademas de editar el css fue necesario editar functions.php

Nota: al editar directamente en el editor del tema el css adicional que hagas quedara incrustado como una etiqueta style al principio del body del sitio así que tendrá prioridad.

Después de editar mi código tanto en personalizar tema como en archivo css principal y el php obtuve este resultado.

Antes de terminar me di cuenta me había faltado definir otro color para las categorías en el modo claro y no se veían por ser del mismo color que el del tema de fondo.

y por ultimo el toque final

power by WordPress & landercorp.mx

con eso ya queda listo mi blog para comenzar a narrar mis aventuras haciendo sitios WEB y aplicaciones en SwiftUI

Categories
Articulo personal Swift Development Web Development

print(“Hola :D mundo”)

Bienvenidos a mi blog donde escribiré sobre mi aventura para convertirme en un desarrollador de iOS / Swift y Desarrollador Web.