Краткий ответ: Обнуляемые указатели из (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.
См. Обнуляемость и цель - C в блоге Swift и SE-0055. Явно обнуляйте небезопасные указатели, используя Optional для получения дополнительной информации об обнуляемости и как (Objective -) C указатели импортируются в Swift.
Так name: CFString!
только говорит нам что компилятор Swift не знает, может ли параметр Objective- C быть NULL или нет, в противном случае он ведет себя как обычный необязательный CFString?
, и вы можете передать значение nil
, которое соответствует нулевому указателю NULL
in (Цель -) C.
Аналогично, const void *object
импортируется в Swift как _ object: UnsafeRawPointer!
, потому что нет аннотации обнуляемости, и вы можете передать nil
здесь (что вы уже делаете в явная форма UnsafeRawPointer?.none
).