24
votes

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.

2
Different question, but may also be interesting in this context: Swift 1.2 optional external variable?. - Martin R
April, 2018. Still need to declare the __nonnull for extern * to avoid the error. - lal

2 Answers

33
votes

I agree that having this specifier shouldn't be required but here is syntax

extern NSString * const MyConstant;

extern NSString * __nonnull  const MyConstant;
7
votes

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.)