Próbuję utworzyć słownik (właściwie HashSet ) z kluczem niestandardowym w Swift, ale w tytule pojawia się błąd:
Protokół „myProtocol” może być używany tylko jako ograniczenie ogólne, ponieważ ma wymagania typu Self lub powiązane
i nie mogę zrobić z tego głów ani ogonów.
protocol Observing: Hashable { }
var observers = HashSet<Observing>()
swift
generics
xcode6
swift-protocols
devios1
źródło
źródło
Odpowiedzi:
Protokół
Observing
dziedziczy po protokoleHashable
, który z kolei dziedziczy po protokoleEquatable
. ProtokółEquatable
ma następujące wymagania:A protokołu, który zawiera
Self
gdzieś w środku, nie można używać nigdzie, z wyjątkiem ograniczenia typu.Oto podobne pytanie.
źródło
Equatable
nie powinno to koniecznie oznaczać,Equatable
ponieważ nie jest to absolutnie konieczne do wygenerowania kodu skrótu.Dictionary
musi być w stanie wiedzieć, czy dany obiekt jest rzeczywiście prawidłowym kluczem, ponieważ dwa różne obiekty mogą wygenerować ten sam kod skrótu. Hmm, to trochę skomplikowane. Więc problem jest naprawdę zEquatable
.Aby rozwiązać ten problem, możesz użyć leków generycznych. Rozważmy ten przykład:
źródło