Swift 5.1:如何将NULL作为参数传递?

3

我正在尝试为CFNotificationCenter设置观察者。

文档中说明:

name

要观察的通知名称。如果为NULL,则针对对象发布的任何通知调用回调。 如果center是Darwin通知中心,则此值不能为NULL。

据我所知,Swift中不存在NULL。那么这个参数应该是什么呢?

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

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

我已经尝试了CFString?NSNullNSNull as String,但编译器报错。
我是否误解了文档?如何为name参数提供NULL值?

2
nil 是什么情况? - Martin R
1
你可以尝试使用 nil - Kishan Bhatiya
@user28434 是的。在Swift中,“Null”不存在,但“nil”存在。 - IloneSP
@Roberto,但是这是相同的概念,不同的名称。 - user28434'mstep
1个回答

5

简短回答: 在Swift中,来自(Objective-)C的Nullable指针是可选指针,您可以传递nil(也称为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!

在Swift中。

关于空性和(Objective-)C指针如何被导入到Swift中的更多信息,请参见Swift博客中的“Nullability and Objective-C”以及“SE-0055 Make unsafe pointer nullability explicit using Optional”

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

同样,const void *object作为_ object: UnsafeRawPointer!导入到Swift中,因为没有空性注释,你可以在这里传递nil(在显式形式UnsafeRawPointer?.none中已经这样做了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接