Fortunately, I found a way:
[@protocol(ModelDidChange) notify:@"Payload"];
This will send the
ModelDidChange
notification with the object parameter @"Payload"
. Note that the compiler will check that there is a
Protocol called ModelDidChange
and the runtime will verify that it is
an actual notification protocol, raising an exception if that is not true.
You can also omit the parameter:
[@protocol(ModelDidChange) notify];
In both cases, the amount of boilerplate or semantic noise is minimised, whereas the core of what is happening is put at the forefront. Compare this to the traditional way:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ModelDidChange" object:@"Payload"]
Here, almost the entire expression is noise, with the relevant pieces being buried near the end of the expression as parameters. No checking is (or can be) performed to ensure that the argument string actually refers to a notification name.
Of course, you can replace that literal string with a string constant, but that constant is also not checked, and since it lives in a global namespace with all other identifiers, it needs quite a bit of prefixing to disambiguate:
[[NSNotificationCenter defaultCenter] postNotificationName:WLCoreNotificationModelDidChange object:@"Payload"]
Would it be easy to spot that this was supposed to be
WLCoreNotificationModelWasDeleted
?
The Macro PROTOCOL_NOTIFY()
is removed, whereas the sendProtocolNotification()
function is retained for Swift compatibility.