objective-cswiftobjective-c-nullability

Objective-C Nullability: Qualifying Constant Strings


I have gotten into a pretty good habit of declaring and using constant strings for things like NSNotification names. I declare them like so:

extern NSString * const ABCAwesomeThingHappenedNotification;

With the introduction of Xcode 6.3 and Swift 1.2, I'm going back and auditing Objective-C classes that interop with Swift using the new nonnull, nullable, and null_unspecified qualifiers.

When adding the qualifiers to a header that also has externally visible static strings, I receive the following warning:

warning: pointer is missing a nullability type specifier (__nonnull or __nullable)

Hmm. That's confusing / interesting. Can someone explain the reasoning behind this message? When using ABCAwesomeThingHappenedNotification in Swift, it never suggests that it's an optional String or implicitly unwrapped String.


Solution

  • In your implementation, you could define:

    NSString * const ABCAwesomeThingHappenedNotification = @"ABCAwesomeThingHappenedNotification";
    

    in which case the pointer is clearly nonnull. However, this is also valid:

    NSString * const ABCAwesomeThingHappenedNotification = nil;
    

    which must be considered nullable because the pointer is always a null pointer.

    (The explicit initialisation to nil is redundant since this happens implicitly if no initial value is provided, but clarifies this example.)