¿Cómo crear una clase rápida por categoría?


84

Quiero crear una categoría de mi clase rápida existente, pero no hay ninguna opción en IDE para hacerlo.

¿Alguna idea de si la categoría existe en el proyecto rápido? ¿O cómo lograr una funcionalidad similar en un proyecto rápido?


2
llamó extension.
holex

Respuestas:


128

En Swift, puede usar Extensionspara agregar nuevas funciones a clases, estructuras y tipos de enumeración existentes.

Se diferencian de las categorías de Objective-C de varias formas, principalmente:

  • No se nombran
  • No es necesario importar una extensión de forma explícita. Si define una extensión para agregar una nueva funcionalidad a un tipo existente, la nueva funcionalidad estará disponible en todas las instancias existentes de ese tipo, incluso si se crearon antes de que se definiera la extensión.
  • Como se indicó anteriormente, no solo funcionan con clases, sino también con otros tipos.

Tal como está hoy, las extensiones pueden:

  • Agregar propiedades calculadas y propiedades estáticas calculadas
  • Definir métodos de instancia y métodos de tipo
  • Proporcionar nuevos inicializadores
  • Definir subíndices
  • Definir y usar nuevos tipos anidados
  • Hacer que un tipo existente se ajuste a un protocolo

La sintaxis básica para declarar una extensión es la siguiente:

extension SomeType {
    // new functionality to add to SomeType goes here
}

Consulte la documentación de Apple para obtener más información sobre cómo usar las extensiones en Swift.


99

En Objective C se llamaban categorías , pero en Swift se llaman extensiones . El propósito de ambos es dar funcionalidad adicional a las clases existentes sin tener que crear subclases.

Había leído sobre extensiones en la documentación, pero realmente no entendía cómo usar una en mi proyecto hasta que vi este video tutorial ( versión de YouTube , fuente de github ).

Aquí hay un resumen tomado del video de cómo hacerlo.

Agrega un archivo Swift a tu proyecto

  • Haga clic derecho en el Navegador de proyectos y elija "Nuevo archivo ..."

  • Seleccione "Archivo Swift"

  • La convención es guardar el nombre del archivo como el nombre de la clase que está ampliando más (con un signo "+") lo que le está haciendo. Por ejemplo, "UIImage + Recorte".

Escribe el código de la extensión.

Abra el nuevo archivo Swift que acaba de crear.

Debe importar UIKit(en lugar de Foundation) si está extendiendo un UIView. Luego use la extensionpalabra clave antes del nombre de la clase que desea extender. Luego puede agregar sus propios métodos nuevos a la clase. (Tenga en cuenta que las extensiones son para agregar nuevos métodos, no anular los métodos existentes, de ahí el nombre).

En el video, el ejemplo fue agregar un método que recorta un círculo de la imagen y le da un borde.

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

Vea aquí el ejemplo completo.

Use su extensión en cualquier lugar de su proyecto

Ahora puede usar su nuevo método para esa clase en cualquier lugar de su código, como si fuera parte de la clase estándar.

Aquí está el ejemplo del video ( en github ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

El método cropToCircleWithBorderColorno es una parte estándar de UIImage, pero como puede ver, se usa tal como estaba.

Para mayor estudio:


8

En Swift se llama Extensiones . Echale un vistazo


Pero los extensions no pueden incluir variables, que hacen las cosas totalmente diferentes.
RnMss

Incluso en las categorías de Objective-C no se pueden tener variables (sin hacks).
Valentin Shergin

ObjC objetos asociados no son hacks
malhal

0

Puede usar el siguiente código en su clase existente

extension name{
func funcName(){
   } 
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.