2014-06-10 11 views
80

Voglio creare una categoria della mia classe Swift esistente, ma non ci sono opzioni in IDE per farlo.Come creare una classe rapida per la categoria?

Qualche idea se la categoria esiste nel progetto rapido? O come ottenere funzionalità simili nel progetto rapido?

+2

si chiama 'extension'. – holex

risposta

118

In Swift, è possibile utilizzare Extensions per aggiungere nuove funzionalità a classi, strutture e tipi di enumerazione esistenti.

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

  • Essi non sono chiamati
  • Non è necessario importare un interno in modo esplicito. Se si definisce un'estensione per aggiungere nuove funzionalità a un tipo esistente, la nuova funzionalità sarà disponibile su tutte le istanze esistenti di quel tipo, anche se sono state create prima della definizione dell'estensione.
  • Come detto sopra, funzionano non solo con le classi, ma anche con altri tipi.

così com'è oggi, Le estensioni possono:

  • Add computerizzata proprietà e le proprietà statiche calcolate
  • Definire metodi di istanza e metodi di tipo
  • Fornire nuovi initializers
  • Definire indici
  • Definire e utilizzare nuovi tipi nidificati
  • Creare un exis Tipo ting conformi ad un protocollo

La sintassi di base per dichiarare un interno è la seguente:

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

Controllare Apple's documentation per ulteriori informazioni su come utilizzare le estensioni a Swift.

8

In Swift si chiama Estensioni! Check it out

+0

Ma 'extension's non può includere variabili, che rendono le cose totalmente diverse. – RnMss

+0

Anche nelle categorie Objective-C non è possibile avere variabili (senza hack). –

91

Nell'obiettivo C erano chiamati categories, ma in Swift sono chiamati extensions. Lo scopo di entrambi è di fornire funzionalità aggiuntive alle classi esistenti senza dover creare sottoclassi.

Avevo letto delle estensioni nella documentazione, ma non ho davvero capito come utilizzarne una nel mio progetto finché non ho guardato this tutorial video (YouTube version, github source).

Ecco un riepilogo tratto dal video di come farlo.

aggiungere un file Swift al progetto

  • clic destro nella navigazione di progetto e scegliere "Nuovo file ..."

  • Selezionare 'File Swift'

  • La convenzione è quello di salvare il nome del file come il nome di classe si sta estendendo più (con un segno '+') quello che state facendo ad esso. Per esempio, "UIImage + ritaglio".

scrivere il codice per l'estensione

Aprire il nuovo file Swift appena creato.

si shou Importare UIKit (anziché Foundation) se si estende un UIView. Quindi utilizzare la parola chiave extension prima del nome della classe che si desidera estendere. È quindi possibile aggiungere i propri nuovi metodi alla classe. (Nota, le estensioni sono per aggiungere nuovi metodi, non sovrascrivere i metodi esistenti - da cui il nome.)

Nel video, l'esempio era di aggiungere un metodo che ritaglia un cerchio dall'immagine e gli dà un bordo.

import UIKit 

extension UIImage { 

    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage { 

     // code to create the cropped circle with colored border 

     return newImage 
    } 
} 

Vedere here per l'esempio completo.

Usa la tua estensione in qualsiasi punto del progetto

Ora è possibile utilizzare il nuovo metodo per quella classe qualsiasi punto del codice, proprio come lo era parte della classe standard.

Ecco l'esempio del video (on 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 cropToCircleWithBorderColor non è una parte standard del UIImage, ma come si può vedere, è utilizzato proprio come si trattasse.

Per ulteriori approfondimenti:

0

È possibile utilizzare seguente codice nel tuo classe esistente

extension name{ 
func funcName(){ 
    } 
} 
Problemi correlati