【问题标题】:Swift 5.1: How can I pass NULL as an argument?Swift 5.1:如何将 NULL 作为参数传递?
【发布时间】:2020-02-05 10:54:57
【问题描述】:

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

documentation 声明:

名称

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

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

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

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

我尝试过CFString?NSNullNSNull as String,但编译器报错。

我是否误解了文档?如何为 name 参数提供 NULL 值?

【问题讨论】:

  • nil 呢?
  • 你可以试试nil
  • @user28434 这是真的。 Null 在 Swift 中不存在,但 nil 存在。
  • @Roberto,但概念相同,名称不同。

标签: ios swift core-foundation swift5.1


【解决方案1】:

简短回答: (Objective-)C 中的可空指针在 Swift 中是 可选 指针,您可以传递 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 中。

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

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

同样,const void *object_ object: UnsafeRawPointer! 的形式导入 Swift,因为没有可空性注释,您可以在此处传递 nil(您已经以显式形式 UnsafeRawPointer?.none 进行了操作)。

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多