首页 > 解决方案 > Swift 5.1:如何将 NULL 作为参数传递?

问题描述

我正在尝试为CFNotificationCenter.

文档指出:

姓名

要观察的通知的名称。如果为 NULL,则为对象发布的任何通知调用回调。如果 center 是一个达尔文通知中心,这个值不能为 NULL。

据我了解NULL,Swift 中不存在。那么这个论点应该是什么呢?

以下编译正常,但空白字符串不是NULL

CFNotificationCenterAddObserver(
    CFNotificationCenterGetDistributedCenter(),
    UnsafeMutableRawPointer?.none,
    receiveNotification,
    "" as CFString,
    UnsafeRawPointer?.none,
    CFNotificationSuspensionBehavior.deliverImmediately
)

我试过了CFString?NSNullNSNull as String编译器抱怨。

我误解了文档吗?如何为名称参数提供 NULL 值?

标签: iosswiftcore-foundationswift5.1

解决方案


简短的回答:来自 (Objective-)C 的可空指针是Swift 中的可选指针,您可以传递nil(aka Optional.none) 作为名称,以便为对象发布的任何通知调用。

一些背景:该函数的 C 声明是

CF_EXPORT void CFNotificationCenterAddObserver(CFNotificationCenterRef center,
               const void *observer,
               CFNotificationCallback callBack, 
               CFStringRef name,
               const void *object,
               CFNotificationSuspensionBehavior suspensionBehavior);

其中name参数的类型是一个指针,声明为

typedef const struct CF_BRIDGED_TYPE(NSString) __CFString * CFStringRef;

它在(Objective-C)文档中明确说明name可以是NULL,但显然函数声明尚未针对可空性进行审核,这就是为什么将参数声明为隐式展开的可选参数

_ name: CFString!

在斯威夫特。

有关可空性以及如何将 (Objective-)C 指针导入 Swift 的更多信息,请参阅Swift 博客中的Nullability 和 Objective-C以及SE-0055 Make unsafe pointer nullability explicit using Optional 。

所以name: CFString!只告诉我们Swift编译器不知道Objective-C参数是否可以为NULL,否则它的行为就像一个常规的可选CFString?,你可以传递一个nil值,它对应NULL于(Objective-)C中的一个空指针.

类似地,const void *object被导入 Swift 是_ object: UnsafeRawPointer!因为没有可空性注解,并且您可以nil在此处传递(您已经在显式形式中执行的操作UnsafeRawPointer?.none)。


推荐阅读