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 Extensions
dodać 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 cropToCircleWithBorderColor
nie jest standardową częścią programu UIImage
, ale jak widać, jest używana tak, jak była.
W Swift nazywa się Extensions ! Sprawdź to
extension
nie 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
.