首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIFT5.1:如何将NULL作为参数传递?

SWIFT5.1:如何将NULL作为参数传递?
EN

Stack Overflow用户
提问于 2020-02-05 10:54:57
回答 1查看 1.6K关注 0票数 2

我正试图为CFNotificationCenter设置一个观测者。

文档指出:

名字 要观察的通知的名称。如果为NULL,则为对象发布的任何通知调用回调。如果中心是达尔文通知中心,则此值不得为空。

据我所知,NULL并不存在于Swift中。那么这个论点应该是什么呢?

下面的代码编译得很好,但是空字符串不是NULL

代码语言:javascript
复制
CFNotificationCenterAddObserver(
    CFNotificationCenterGetDistributedCenter(),
    UnsafeMutableRawPointer?.none,
    receiveNotification,
    "" as CFString,
    UnsafeRawPointer?.none,
    CFNotificationSuspensionBehavior.deliverImmediately
)

我已经尝试过CFString?NSNullNSNull as String,但是编译器会抱怨。

我有误解文件吗?如何为名称paramenter提供空值?

EN

回答 1

Stack Overflow用户

发布于 2020-02-05 11:04:58

简短的回答:( object中的可空指针是Swift中的可选指针,您可以将nil (又名Optional.none)传递给名称,以便调用对象发布的任何通知。

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

代码语言:javascript
复制
CF_EXPORT void CFNotificationCenterAddObserver(CFNotificationCenterRef center,
               const void *observer,
               CFNotificationCallback callBack, 
               CFStringRef name,
               const void *object,
               CFNotificationSuspensionBehavior suspensionBehavior);

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

代码语言:javascript
复制
typedef const struct CF_BRIDGED_TYPE(NSString) __CFString * CFStringRef;

在(Objective)文档中明确指出,name可以是NULL,但是函数声明显然没有被审核为空,这就是为什么参数被声明为隐式未包装的可选的原因。

代码语言:javascript
复制
_ name: CFString!

在斯威夫特。

请参阅Swift博客中的无空性和目标-CSE-0055使用可选选项使不安全指针可空性显式显示。中的更多信息,以获得有关空值性以及如何将(Objective)指针导入Swift的更多信息。

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

类似地,const void *object被导入到Swift作为_ object: UnsafeRawPointer!,因为这里没有空性注释,而且您可以在这里传递nil (已经以显式形式UnsafeRawPointer?.none所做的操作)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60074218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档