Come creare una classe rapida per categoria?


84

Voglio creare una categoria della mia classe swift esistente, ma non c'è alcuna opzione in IDE per farlo.

Qualche idea se la categoria esiste in Swift Project? O come ottenere funzionalità simili in un progetto rapido?


2
ha chiamato extension.
holex

Risposte:


128

In Swift, puoi utilizzare Extensionsper aggiungere nuove funzionalità a classi, strutture e tipi di enumerazione esistenti.

Differiscono dalle categorie Objective-C in alcuni modi, principalmente:

  • Non sono nominati
  • Non è necessario importare un'estensione in modo esplicito. Se definisci un'estensione per aggiungere una nuova funzionalità a un tipo esistente, la nuova funzionalità sarà disponibile su tutte le istanze esistenti di quel tipo, anche se sono state create prima che l'estensione fosse definita.
  • Come affermato sopra, funzionano non solo con le classi, ma anche con altri tipi.

Allo stato attuale, le estensioni possono:

  • Aggiungi proprietà calcolate e proprietà statiche calcolate
  • Definire metodi di istanza e metodi di tipo
  • Fornisci nuovi inizializzatori
  • Definisci pedici
  • Definisci e utilizza nuovi tipi annidati
  • Rendi un tipo esistente conforme a un protocollo

La sintassi di base per dichiarare un'estensione è la seguente:

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

Controlla la documentazione di Apple per ulteriori informazioni su come utilizzare le estensioni in Swift.


99

In Objective C erano chiamate categorie , ma in Swift sono chiamate estensioni . Lo scopo di entrambi è fornire funzionalità aggiuntive alle classi esistenti senza dover creare sottoclassi.

Avevo letto delle estensioni nella documentazione, ma non capivo davvero come usarne una nel mio progetto finché non ho visto questo video tutorial ( versione YouTube , sorgente github ).

Ecco un riassunto tratto dal video di come farlo.

Aggiungi un file Swift al tuo progetto

  • Fai clic con il pulsante destro del mouse nel Navigatore progetto e scegli "Nuovo file ..."

  • Seleziona "Swift File"

  • La convenzione è di salvare il nome del file come nome della classe che si sta estendendo più (con un segno "+") ciò che gli si sta facendo. Ad esempio, "UIImage + Cropping".

Scrivi il codice per l'estensione

Apri il nuovo file Swift che hai appena creato.

Dovresti importare UIKit(invece di Foundation) se estendi un file UIView. Quindi utilizzare la extensionparola chiave prima del nome della classe che si desidera estendere. È quindi possibile aggiungere i propri nuovi metodi alla classe. (Nota, le estensioni servono per aggiungere nuovi metodi, non per sovrascrivere i metodi esistenti, da cui il nome.)

Nel video, l'esempio consisteva nell'aggiungere un metodo che ritaglia un cerchio dall'immagine e le assegna un bordo.

import UIKit

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

Vedi qui per l'esempio completo.

Usa la tua estensione ovunque nel tuo progetto

Ora puoi usare il tuo nuovo metodo per quella classe ovunque nel tuo codice, proprio come se fosse parte della classe standard.

Ecco l'esempio del video ( su 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)
    }
}

Il metodo cropToCircleWithBorderColornon è una parte standard di UIImage, ma come puoi vedere, viene utilizzato esattamente come lo era.

Per ulteriori studi:


8

In Swift si chiama Estensioni ! Controlla


Ma extensions non può includere variabili, che rendono le cose totalmente diverse.
RnMss

Anche nelle categorie Objective-C non possono esserci variabili (senza hack).
Valentin Shergin,

Gli oggetti associati a ObjC non sono hack
malhal

0

Puoi usare il seguente codice nella tua classe esistente

extension name{
func funcName(){
   } 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.