Ważniejsze jest zrozumienie, czym one są, a jakie są między nimi różnice.
Any
oznacza "coś", począwszy od szybkich wyliczeń, krotek, zamknięć, struktur, klas, protokołów, cokolwiek. Każdy typ można przypisać do zmiennej typu Any
.
Hashable
to protokół, który mówi, że "ten obiekt może zostać zaszyfrowany, tzn. Ma kod skrótu". Jeśli twój obiekt może zostać zaszyfrowany, zaimplementuj ten protokół, ponieważ potrzebuje go wiele struktur danych (mianowicie słowniki i zestawy).
Czym jest AnyHashable
?
Normalnie, jeśli spróbujesz to zrobić:
let a: Set<Hashable>?
nie skompilować. Dzieje się tak, ponieważ Hashable
dziedziczy po Equatable
, która zawiera Self
.
Teraz powiedzmy, że chcesz przenieść metodę z Objective-C na szybką. Ta metoda przyjmuje parametr typu NSSet
. W Swift zmieni się to w Set
, ale jaki jest jego ogólny parametr? Jeśli po prostu wstawimy Any
s, tak jak robimy z NSArray
s, to nie działa, ponieważ obiekty Set
muszą być nieosiągalne. Ale jeśli wstawimy Set<Hashable>
, to też nie działa, ponieważ Hashable
może być używane tylko jako ogólne ograniczenie. Dlatego też owinięte Hashable
z AnyHashable
, które nie są używane, a więc mogą być używane jako parametr ogólny.
co chodzi „typ skasowane” oznacza:
Mając Self
w protokole jest coś w rodzaju protokołu z parametru rodzajowego, a parametr generyczny jest zawsze klasa Conforming. Powoduje to, że protokoły nie mogą być używane samodzielnie, np. Set<Hashable>
, ponieważ "ogólny parametr" jest nieznany. AnyHashable
rozwiązuje ten problem, nie używając w ogóle Self
, więc teraz staje się normalną strukturą."Wymazuje" ogólny typ Self
.
zobacz to raz https://stackoverflow.com/questions/39382852/didreceiveremotenotification-not-called-ios-10/39383027#39383027 –