24

我已经养成了一个很好的习惯,即为NSNotification名称之类的东西声明和使用常量字符串。我这样声明它们:

extern NSString * const ABCAwesomeThingHappenedNotification;

随着 Xcode 6.3 和 Swift 1.2 的引入,我将回过头来审核使用 new 、 和 限定符与 Swift 互操作的 Objective- nonnullCnullablenull_unspecified

将限定符添加到也具有外部可见静态字符串的标头时,我收到以下警告:

警告:指针缺少可空性类型说明符(__nonnull 或 __nullable)

唔。这令人困惑/有趣。有人可以解释此消息背后的原因吗?在 Swift 中使用ABCAwesomeThingHappenedNotification时,它从不暗示它是可选字符串或隐式解包字符串。

4

2 回答 2

33

我同意不需要这个说明符,但这里是语法

extern NSString * const MyConstant;

extern NSString * __nonnull  const MyConstant;
于 2015-05-07T09:14:34.777 回答
7

在您的实现中,您可以定义:

NSString * const ABCAwesomeThingHappenedNotification = @"ABCAwesomeThingHappenedNotification";

在这种情况下,指针显然是nonnull. 但是,这也是有效的:

NSString * const ABCAwesomeThingHappenedNotification = nil;

必须考虑这一点nullable,因为指针始终是空指针。

(显式初始化nil是多余的,因为如果没有提供初始值,这会隐式发生,但澄清了这个例子。)

于 2015-04-18T20:58:58.590 回答