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?
Risposte:
In Swift, puoi utilizzare Extensions
per aggiungere nuove funzionalità a classi, strutture e tipi di enumerazione esistenti.
Differiscono dalle categorie Objective-C in alcuni modi, principalmente:
Allo stato attuale, le estensioni possono:
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.
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.
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".
Apri il nuovo file Swift che hai appena creato.
Dovresti importare UIKit
(invece di Foundation
) se estendi un file UIView
. Quindi utilizzare la extension
parola 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.
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 cropToCircleWithBorderColor
non è una parte standard di UIImage
, ma come puoi vedere, viene utilizzato esattamente come lo era.
Puoi usare il seguente codice nella tua classe esistente
extension name{
func funcName(){
}
}
extension
.