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?
Odpowiedzi:
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:
W obecnej formie rozszerzenia mogą:
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.
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ć.
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”.
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.
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.
W Swift nazywa się Extensions ! Sprawdź to
extensionnie może zawierać zmiennych, które sprawiają, że rzeczy są zupełnie inne.
Możesz użyć następującego kodu w swojej istniejącej klasie
extension name{
func funcName(){
}
}
extension.