W Objective-C niestandardowe powiadomienie jest zwykłym NSStringiem, ale w wersji WWDC Swift 3 nie jest oczywiste, jakie powinno być.
112
W Objective-C niestandardowe powiadomienie jest zwykłym NSStringiem, ale w wersji WWDC Swift 3 nie jest oczywiste, jakie powinno być.
Odpowiedzi:
Możesz również użyć do tego protokołu
A następnie zdefiniuj nazwy powiadomień w
enum
dowolnym miejscu. Na przykład:I używaj go jak
W ten sposób nazwy powiadomień zostaną oddzielone od Fundacji
Notification.Name
. I będziesz musiał zmodyfikować swój protokół tylko w przypadku implementacjiNotification.Name
zmian.źródło
NotificationName
takname
nieruchomość jest dodawany jedynie teksty stałe, które są zgodne z protokołem.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Jest na to czystszy (myślę) sposób
A potem możesz go używać w ten sposób
źródło
extension NSNotification.Name
zamiastextension Notification.Name
. W przeciwnym razie Swift 3'Notification' is ambiguous for type lookup in this context
Notification.post definiuje się jako:
W Objective-C nazwą powiadomienia jest zwykły NSString. W Swift jest zdefiniowany jako NSNotification.Name.
NSNotification.Name jest zdefiniowane jako:
To trochę dziwne, ponieważ spodziewałbym się, że będzie to Enum, a nie jakaś niestandardowa struktura, która pozornie nie ma więcej korzyści.
W Notification for NSNotification.Name występuje alias typu:
Mylące jest to, że zarówno Notification, jak i NSNotification istnieją w Swift
Aby zdefiniować własne niestandardowe powiadomienie, zrób coś takiego:
Następnie nazwij to:
źródło
Notification.Name
było wyliczeniem, nikt nie byłby w stanie zdefiniować nowych powiadomień. Używamy struktur dla innych typów wyliczeniowych, które muszą umożliwiać dodawanie nowych członków. (Zobacz propozycję szybkiej ewolucji .)Notification
jest typem wartości (strukturą), dzięki czemu może skorzystać z semantyki języka Swift dla zmienności wartości (nie). Generalnie typy Foundation porzucają swój „NS” w Swift 3, ale tam, gdzie istnieje jeden z nowych Foundation Value Types, który go zastępuje, stary typ referencyjny pozostaje (zachowując nazwę „NS”), dzięki czemu można go nadal używać, gdy potrzebujesz semantyki referencji lub podklasy jej. Zobacz propozycję .Łatwiejszy sposób:
źródło
Możesz dodać niestandardowy inicjator do NSNotification.Name
Stosowanie:
źródło
case
s w wyliczeniu powinny być pisane małymi literami, a nie samo wyliczenie. Nazwy typów są pisane wielkimi literami, a wyliczenia są typami.Mogę zasugerować inną opcję, podobną do tej, którą zasugerował @CesarVarela.
Umożliwi to łatwe publikowanie i subskrybowanie powiadomień.
Mam nadzieję, że to ci pomoże.
źródło
Zrobiłem własną implementację, mieszając rzeczy stamtąd i tam i uważam to za najwygodniejsze. Udostępnianie dla kogo może być zainteresowany:
źródło
źródło
To tylko odniesienie
źródło
Zaletą używania wyliczeń jest to, że otrzymujemy kompilator, aby sprawdzić, czy nazwa jest poprawna. Zmniejsza potencjalne problemy i ułatwia refaktoryzację.
Dla tych, którzy lubią używać wyliczeń zamiast cytowanych ciągów znaków w nazwach powiadomień, ten kod załatwia sprawę:
Następnie możesz go użyć w ten sposób:
Chociaż nie ma to związku z pytaniem, to samo można zrobić z fragmentami scenorysu, aby uniknąć wpisywania cytowanych ciągów:
Następnie na kontrolerze widoku nazwij to tak:
źródło
NotificationCenter.default.post(.somethingHappened)
Powoduje to błąd; metody dodane w rozszerzeniu akceptują więcej argumentów.jeśli używasz powiadomień niestandardowych zawierających tylko ciągi znaków, nie ma powodu, aby rozszerzać jakiekolwiek klasy, ale
String
źródło
Odpowiedź @ CesarVarela jest dobra, ale aby uczynić kod nieco czystszym, możesz wykonać następujące czynności:
źródło
Jeśli chcesz, aby to działało czysto w projekcie, który używa jednocześnie Objective-C i Swift, stwierdziłem, że łatwiej jest tworzyć powiadomienia w Objective-C.
Utwórz plik .m / .h:
W swoim
MyProject-Bridging-Header.h
(nazwanym na cześć twojego projektu), aby pokazać je Swift.Korzystaj z powiadomień w Objective-C w ten sposób:
A w Swift (5) w ten sposób:
źródło