In Objective-C ist eine benutzerdefinierte Benachrichtigung nur ein einfacher NSString, in der WWDC-Version von Swift 3 ist jedoch nicht klar, wie sie aussehen sollte.
112
In Objective-C ist eine benutzerdefinierte Benachrichtigung nur ein einfacher NSString, in der WWDC-Version von Swift 3 ist jedoch nicht klar, wie sie aussehen sollte.
Antworten:
Sie können hierfür auch ein Protokoll verwenden
Und definieren Sie dann Ihre Benachrichtigungsnamen als eine
enum
beliebige Stelle. Beispielsweise:Und benutze es gerne
Auf diese Weise werden die Benachrichtigungsnamen von der Stiftung entkoppelt
Notification.Name
. Und Sie müssen Ihr Protokoll nur ändern, wenn die Implementierung fürNotification.Name
Änderungen vorsieht.quelle
NotificationName
sodass diename
Eigenschaft nur zu den Aufzählungen hinzugefügt wird, die dem Protokoll entsprechen.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Es gibt einen saubereren (glaube ich) Weg, dies zu erreichen
Und dann können Sie es so verwenden
quelle
extension NSNotification.Name
stattextension Notification.Name
. Ansonsten Swift 3 Beschwerden mit'Notification' is ambiguous for type lookup in this context
Notification.post ist definiert als:
In Objective-C ist der Benachrichtigungsname ein einfacher NSString. In Swift ist es als NSNotification.Name definiert.
NSNotification.Name ist definiert als:
Dies ist etwas seltsam, da ich erwarten würde, dass es sich um eine Aufzählung handelt und nicht um eine benutzerdefinierte Struktur, die anscheinend keinen Nutzen mehr hat.
In Notification for NSNotification.Name gibt es einen Typealias.
Der verwirrende Teil ist, dass sowohl Benachrichtigung als auch NS-Benachrichtigung in Swift vorhanden sind
Um Ihre eigene benutzerdefinierte Benachrichtigung zu definieren, gehen Sie wie folgt vor:
Dann um es zu nennen:
quelle
Notification.Name
es sich um eine Aufzählung handelt, kann niemand neue Benachrichtigungen definieren. Wir verwenden Strukturen für ansonsten enumähnliche Typen, die das Hinzufügen neuer Mitglieder ermöglichen müssen. (Siehe den Vorschlag zur schnellen Entwicklung .)Notification
ist ein Werttyp (eine Struktur), so dass er von Swifts Semantik für Wert (im) Mutabilität profitieren kann. Im Allgemeinen löschen Foundation-Typen ihre "NS" in Swift 3, aber wenn einer der neuen Foundation-Werttypen vorhanden ist, um ihn zu ersetzen, bleibt der alte Referenztyp erhalten (wobei der Name "NS" beibehalten wird), sodass Sie ihn weiterhin verwenden können, wenn Sie benötigen eine Referenzsemantik oder eine Unterklasse. Siehe den Vorschlag .Einfacherer Weg:
quelle
Sie können NSNotification.Name einen benutzerdefinierten Initialisierer hinzufügen
Verwendung:
quelle
case
s in einer Aufzählung sollte in Kleinbuchstaben geschrieben werden, nicht die Aufzählung selbst. Typnamen werden in Großbuchstaben geschrieben und Aufzählungen sind Typen.Ich kann eine andere Option vorschlagen, die der von @CesarVarela vorgeschlagenen ähnelt.
Auf diese Weise können Sie Benachrichtigungen einfach veröffentlichen und abonnieren.
Hoffe das wird dir helfen.
quelle
Ich habe meine eigene Implementierung durchgeführt, um die Dinge von dort und dort zu mischen, und finde dies am bequemsten. Teilen für wen auch immer das interessiert sein könnte:
quelle
quelle
Dies ist nur eine Referenz
quelle
Der Vorteil der Verwendung von Aufzählungen besteht darin, dass der Compiler überprüft, ob der Name korrekt ist. Reduziert potenzielle Probleme und erleichtert das Refactoring.
Für diejenigen, die Enums anstelle von Anführungszeichen für Benachrichtigungsnamen verwenden möchten, ist dieser Code genau das Richtige:
Dann können Sie es so verwenden:
Obwohl dies nichts mit der Frage zu tun hat, kann dies auch mit Storyboard-Abschnitten geschehen, um die Eingabe von Zeichenfolgen in Anführungszeichen zu vermeiden:
Nennen Sie es dann auf Ihrem View Controller wie folgt:
quelle
NotificationCenter.default.post(.somethingHappened)
Dies löst einen Fehler aus. Die Methoden, die Sie in Ihrer Erweiterung hinzugefügt haben, akzeptieren mehr Argumente.Wenn Sie benutzerdefinierte Benachrichtigungen nur für Zeichenfolgen verwenden, gibt es keinen Grund, Klassen zu erweitern
String
quelle
@ CesarVarelas Antwort ist gut, aber um den Code etwas sauberer zu machen, können Sie Folgendes tun:
quelle
Wenn Sie möchten, dass dies in einem Projekt, das gleichzeitig Objective-C und Swift verwendet, sauber funktioniert, war es für mich einfacher, die Benachrichtigungen in Objective-C zu erstellen.
Erstellen Sie eine .m / .h-Datei:
In Ihrem
MyProject-Bridging-Header.h
(nach Ihrem Projekt benannt), um sie Swift auszusetzen.Verwenden Sie Ihre Benachrichtigungen in Objective-C wie folgt:
Und in Swift (5) so:
quelle