我正试图为CFNotificationCenter设置一个观测者。
文档指出:
名字 要观察的通知的名称。如果为NULL,则为对象发布的任何通知调用回调。如果中心是达尔文通知中心,则此值不得为空。
据我所知,NULL并不存在于Swift中。那么这个论点应该是什么呢?
下面的代码编译得很好,但是空字符串不是NULL
CFNotificationCenterAddObserver(
CFNotificationCenterGetDistributedCenter(),
UnsafeMutableRawPointer?.none,
receiveNotification,
"" as CFString,
UnsafeRawPointer?.none,
CFNotificationSuspensionBehavior.deliverImmediately
)我已经尝试过CFString?、NSNull和NSNull as String,但是编译器会抱怨。
我有误解文件吗?如何为名称paramenter提供空值?
发布于 2020-02-05 11:04:58
简短的回答:( object中的可空指针是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)文档中明确指出,name可以是NULL,但是函数声明显然没有被审核为空,这就是为什么参数被声明为隐式未包装的可选的原因。
_ name: CFString!在斯威夫特。
请参阅Swift博客中的无空性和目标-C和SE-0055使用可选选项使不安全指针可空性显式显示。中的更多信息,以获得有关空值性以及如何将(Objective)指针导入Swift的更多信息。
因此,name: CFString!只告诉我们,Swift编译器不知道目标-C参数是否为空,否则它的行为就像一个常规的可选CFString?,您可以传递一个nil值,该值对应于(Objective)C中的空指针NULL。
类似地,const void *object被导入到Swift作为_ object: UnsafeRawPointer!,因为这里没有空性注释,而且您可以在这里传递nil (已经以显式形式UnsafeRawPointer?.none所做的操作)。
https://stackoverflow.com/questions/60074218
复制相似问题