ios - Swift 5.1:如何将 NULL 作为参数传递?
问题描述
我正在尝试为CFNotificationCenter
.
该文档指出:
姓名
要观察的通知的名称。如果为 NULL,则为对象发布的任何通知调用回调。如果 center 是一个达尔文通知中心,这个值不能为 NULL。
据我了解NULL
,Swift 中不存在。那么这个论点应该是什么呢?
以下编译正常,但空白字符串不是NULL
:
CFNotificationCenterAddObserver(
CFNotificationCenterGetDistributedCenter(),
UnsafeMutableRawPointer?.none,
receiveNotification,
"" as CFString,
UnsafeRawPointer?.none,
CFNotificationSuspensionBehavior.deliverImmediately
)
我试过了CFString?
,NSNull
但NSNull as String
编译器抱怨。
我误解了文档吗?如何为名称参数提供 NULL 值?
解决方案
简短的回答:来自 (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
)。
推荐阅读
- c# - SignalR 立即断开连接,无需更改 .NET Core 3.1 上的代码
- c# - 将字典写入文件,从文件中检索字典
- python - 插入语句返回'对象没有属性'uuid'
- svelte - 从一个组件到另一个组件的细化数据
- node.js - multipart/form-data 使用 axios 发送空数据
- terminal - zsh:找不到命令:mkdir
- javascript - 首次单击后按钮的作用相反
- java - SonarQube 一直抱怨 Use try-with-resources 或在“finally”子句中关闭此“PreparedStatement”
- r - ggsave 不保存绘图
- sql - 在 PostgreSQL IF / THEN 语句中使用 DELETE FROM...RETURNING