Używanie protokołów jako typów tablic i parametrów funkcji w swift
Chcę utworzyć klasę, która może przechowywać obiekty zgodne z określonym protokołem. Obiekty muszą być przechowywane w tablicy określonego typu. Zgodnie z dokumentacją Swift protokoły mogą być używane jako typy:
Ponieważ jest to typ, możesz używać protokołu w wielu miejscach, w których dozwolone są inne typy, w tym:
- Jako parametr lub typ zwracany w funkcji, metodzie lub inicjatorze
- Jako typ stałej, zmiennej lub właściwości
- Jako typ elementów w tablicy, słowniku lub innym kontenerze
Protokół „SomeProtocol” może być używany tylko jako ogólne ograniczenie, ponieważ ma własne lub powiązane wymagania dotyczące typu
Jak zamierzasz to rozwiązać:
protocol SomeProtocol: Equatable {
func bla()
}class SomeClass {
var protocols = [SomeProtocol]()
func addElement(element: SomeProtocol) {
self.protocols.append(element)
}
func removeElement(element: SomeProtocol) {
if let index = find(self.protocols, element) {
self.protocols.removeAtIndex(index)
}
}
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
7 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Zobacz też
rozszerzanie tablicy, aby sprawdzić, czy jest posortowana w języku Swift?
https://coderoad.ru/24602595/, zawiera sugestie, jak obejść ten problem, co może być odpowiednie dla konkretnego problemu (Twoje pytanie jest bardzo ogólne, być może możesz znaleźć obejście, korzystając z tych odpowiedzi).
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
W niektórych przypadkach możesz użyć wymazywalnego opakowania, aby nadać swojej kolekcji homomorfizm. Poniżej przykład.
Anonimowy użytkownik
Potwierdzenie od:
Zdaję sobie sprawę, że to nie zadziała dla struktur i tak dalej, ale w moim przypadku było wystarczająco dobre.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Ponieważ i tak będziesz potrzebować jakiejś charakterystycznej właściwości, aby oddzielić swoje obiekty, założyłem, że to „nazwa”. Upewnij się, że do element.name = "foo" podczas tworzenia nowej instancji SomeProtocol. Jeśli nie podano nazwy, nadal możesz utworzyć instancję, ale nie zostanie ona dodana do kolekcji, a metoda addElement () zwróci wartość „false”.
Anonimowy użytkownik
Potwierdzenie od:
nie
czyste-czyste rozwiązanie Swift na tym blogu:
http://blog.inferis.org/blog/2 ... ocols
http://blog.inferis.org/blog/2 ... cols/
/
Sztuczka polega na dopasowaniu , ponieważ wprowadza on .
Dlatego zamiast korzystać z protokołu i jego standardowego zastosowania , możesz napisać własną funkcję, aby znaleźć element i go usunąć.
Oto implementacja Twojej funkcji :
Uwaga: w tym przypadku, twoje obiekty pasujące do muszą dziedziczyć po .