Jak stworzyć szybką klasę dla kategorii?

84

Chcę utworzyć kategorię mojej istniejącej klasy Swift, ale w IDE nie ma takiej opcji.

Masz jakiś pomysł, czy kategoria istnieje w szybkim projekcie? Albo jak osiągnąć podobną funkcjonalność w szybkim projekcie?

Khawar
źródło
2
nazywało się extension.
holex

Odpowiedzi:

128

W języku Swift możesz Extensionsdodać nową funkcjonalność do istniejących klas, struktur i typów wyliczeniowych.

Różnią się one od kategorii Cel-C na kilka sposobów, głównie:

  • Nie są nazwani
  • Nie musisz jawnie importować rozszerzenia. Jeśli zdefiniujesz rozszerzenie, aby dodać nową funkcjonalność do istniejącego typu, nowa funkcjonalność będzie dostępna we wszystkich istniejących instancjach tego typu, nawet jeśli zostały utworzone przed zdefiniowaniem rozszerzenia.
  • Jak wspomniano powyżej, działają one nie tylko z klasami, ale także z innymi typami.

W obecnej formie rozszerzenia mogą:

  • Dodaj obliczone właściwości i obliczone właściwości statyczne
  • Zdefiniuj metody instancji i metody typu
  • Podaj nowe inicjatory
  • Zdefiniuj indeksy
  • Zdefiniuj i użyj nowych typów zagnieżdżonych
  • Spraw, aby istniejący typ był zgodny z protokołem

Podstawowa składnia deklarowania rozszerzenia jest następująca:

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

Sprawdź dokumentację Apple, aby uzyskać więcej informacji na temat korzystania z rozszerzeń w Swift.

Cezar
źródło
99

W celu C nazywano je kategoriami , ale w języku Swift nazywane są rozszerzeniami . Ich celem jest nadanie dodatkowej funkcjonalności istniejącym klasom bez konieczności tworzenia podklas.

Czytałem o rozszerzeniach w dokumentacji, ale tak naprawdę nie rozumiałem, jak ich używać w moim projekcie, dopóki nie obejrzałem tego samouczka wideo ( wersja YouTube , źródło github ).

Oto podsumowanie zaczerpnięte z filmu, jak to zrobić.

Dodaj plik Swift do swojego projektu

  • Kliknij prawym przyciskiem myszy w Nawigatorze projektu i wybierz „Nowy plik ...”

  • Wybierz „Swift File”

  • Konwencja polega na zapisaniu nazwy pliku jako nazwy rozszerzanej klasy oraz (ze znakiem „+”), co z nim robisz. Na przykład „UIImage + przycinanie”.

Napisz kod rozszerzenia

Otwórz nowy plik Swift, który właśnie utworzyłeś.

Powinieneś zaimportować UIKit(zamiast Foundation), jeśli rozszerzasz plik UIView. Następnie użyjextension słowa kluczowego przed nazwą klasy, którą chcesz rozszerzyć. Następnie możesz dodać własne nowe metody do klasy. (Uwaga, rozszerzenia służą do dodawania nowych metod, a nie zastępowania istniejących metod - stąd nazwa).

W filmie przykładem było dodanie metody, która wycina okrąg z obrazu i nadaje mu ramkę.

import UIKit

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

Zobacz tutaj pełny przykład.

Używaj swojego rozszerzenia w dowolnym miejscu w projekcie

Teraz możesz użyć swojej nowej metody dla tej klasy w dowolnym miejscu w kodzie, tak jakby była częścią standardowej klasy.

Oto przykład wideo ( na 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)
    }
}

Metoda cropToCircleWithBorderColornie jest standardową częścią programu UIImage, ale jak widać, jest używana tak, jak była.

Do dalszych badań:

Suragch
źródło
8

W Swift nazywa się Extensions ! Sprawdź to

iSofTom
źródło
Ale extensionnie może zawierać zmiennych, które sprawiają, że rzeczy są zupełnie inne.
RnMss
Nawet w kategoriach Objective-C nie można mieć zmiennych (bez hacków).
Valentin Shergin
Obiekty powiązane z ObjC to nie hacki
malhal
0

Możesz użyć następującego kodu w swojej istniejącej klasie

extension name{
func funcName(){
   } 
}
vikrant tanwar
źródło