Wie erstelle ich eine schnelle Klasse für eine Kategorie?


84

Ich möchte eine Kategorie meiner vorhandenen Swift-Klasse erstellen, aber es gibt keine Option in der IDE, dies zu tun.

Irgendeine Idee, ob eine Kategorie in einem schnellen Projekt existiert? Oder wie erreicht man ähnliche Funktionen in einem schnellen Projekt?


2
es rief an extension.
Holex

Antworten:


128

In Swift können Sie Extensionsvorhandenen Klassen, Strukturen und Aufzählungstypen neue Funktionen hinzufügen.

Sie unterscheiden sich in einigen Punkten von den Objective-C-Kategorien, hauptsächlich:

  • Sie sind nicht benannt
  • Sie müssen eine Erweiterung nicht explizit importieren. Wenn Sie eine Erweiterung definieren, um einem vorhandenen Typ neue Funktionen hinzuzufügen, ist die neue Funktionalität für alle vorhandenen Instanzen dieses Typs verfügbar, auch wenn sie vor der Definition der Erweiterung erstellt wurden.
  • Wie oben erwähnt, funktionieren sie nicht nur mit Klassen, sondern auch mit anderen Typen.

Nach heutigem Stand können Erweiterungen:

  • Fügen Sie berechnete Eigenschaften und berechnete statische Eigenschaften hinzu
  • Definieren Sie Instanzmethoden und Typmethoden
  • Stellen Sie neue Initialisierer bereit
  • Indizes definieren
  • Definieren und verwenden Sie neue verschachtelte Typen
  • Stellen Sie sicher, dass ein vorhandener Typ einem Protokoll entspricht

Die grundlegende Syntax zum Deklarieren einer Erweiterung lautet wie folgt:

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

Weitere Informationen zur Verwendung von Erweiterungen in Swift finden Sie in der Apple-Dokumentation .


99

In Ziel C wurden sie als Kategorien bezeichnet , in Swift als Erweiterungen . Beide dienen dazu, vorhandenen Klassen zusätzliche Funktionen zu verleihen, ohne Unterklassen erstellen zu müssen.

Ich hatte in der Dokumentation über Erweiterungen gelesen, aber ich habe nicht wirklich verstanden, wie man eine in meinem Projekt verwendet, bis ich mir dieses Tutorial-Video ( YouTube-Version , Github-Quelle ) angesehen habe.

Hier ist eine Zusammenfassung aus dem Video, wie es geht.

Fügen Sie Ihrem Projekt eine Swift-Datei hinzu

  • Klicken Sie mit der rechten Maustaste in den Projektnavigator und wählen Sie "Neue Datei ...".

  • Wählen Sie "Swift File"

  • Die Konvention besteht darin, den Dateinamen als den Klassennamen zu speichern, den Sie erweitern, plus (mit einem "+" - Zeichen), was Sie damit machen. Zum Beispiel "UIImage + Cropping".

Schreiben Sie den Code für die Erweiterung

Öffnen Sie die neue Swift-Datei, die Sie gerade erstellt haben.

Sie sollten UIKit(anstelle von Foundation) importieren, wenn Sie a erweitern UIView. Verwenden Sie dann das extensionSchlüsselwort vor dem Klassennamen, den Sie erweitern möchten. Sie können der Klasse dann Ihre eigenen neuen Methoden hinzufügen. (Beachten Sie, dass Erweiterungen zum Hinzufügen neuer Methoden dienen und vorhandene Methoden nicht überschreiben - daher der Name.)

Im Video wurde beispielsweise eine Methode hinzugefügt, mit der ein Kreis aus dem Bild ausgeschnitten und ihm ein Rand zugewiesen wird.

import UIKit

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

Sehen Sie hier für das gesamte Beispiel.

Verwenden Sie Ihre Erweiterung an einer beliebigen Stelle in Ihrem Projekt

Jetzt können Sie Ihre neue Methode für diese Klasse an einer beliebigen Stelle in Ihrem Code verwenden, genau wie sie Teil der Standardklasse war.

Hier ist das Beispiel des Videos ( auf 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)
    }
}

Die Methode cropToCircleWithBorderColorist kein Standardteil von UIImage, aber wie Sie sehen, wird sie sozusagen verwendet.

Für weitere Studien:


8

In Swift heißt es Extensions ! Hör zu


Aber extensions kann keine Variablen enthalten, die die Dinge völlig anders machen.
RnMss

Selbst in Objective-C-Kategorien können keine Variablen (ohne Hacks) vorhanden sein.
Valentin Shergin

ObjC assoziierte Objekte sind keine Hacks
Malhal

0

Sie können folgenden Code in Ihrer vorhandenen Klasse verwenden

extension name{
func funcName(){
   } 
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.