2017-06-13 12 views
11

Podrapuję się przez wiele samouczków, aby zrozumieć różnicę pomiędzy powyższymi 3 terminami i znaleźć nowy termin type erased kontener, teraz stało się to mylące dla mnie. Powstaje wiele pytań.Czym różni się Any, Hashable, AnyHashable w Swift 3?

Dlaczego Swift wprowadza AnyHashable?

Jaka jest zasadnicza różnica między tymi trzema terminami?

Różnica między Any a AnyHashable?

Różnica między Hashable a AnyHashable?

Kiedy używać Hashable i kiedy do AnyHashable?

Ostatnie, ale najbardziej mylące, co to jest termin type erased w kontekście AnyHashable?

Poszłam za Swift Evolution Proposal SE-0131.

+0

zobacz to raz https://stackoverflow.com/questions/39382852/didreceiveremotenotification-not-called-ios-10/39383027#39383027 –

Odpowiedz

8

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.

+0

Wszystko rozumiane, inne niż termin "typ wymazany", staram się to zrozumieć. – technerd

+0

Czego nie rozumiesz o "typie wymazanym"? @technerd – Sweeper

+0

Szczerze mówiąc, wymazywanie tekstu wydaje mi się dziwne. Próbuję zrozumieć z tego przykładu.https: //www.natashatherobot.com/swift-type-erasure/ – technerd

Powiązane problemy