它看起来像适用于 iOS 的 GoogleCast SDK(至少是 3.3.0 版,我们与之前的版本一起发布;也许这已经在我们升级到的更新版本中得到修复,但我想确定一下)有时是报告错误时向委托发送 nil,即使注释声称它是非空的。反过来,当我们尝试查看错误时,这会使我们的 Swift 代码崩溃。
假设我不想触摸上游标头,是否有任何方法可以覆盖标头中的可空性注释?如果我只是定义我的委托方法来接收一个Error?,我会收到一个警告。
它看起来像适用于 iOS 的 GoogleCast SDK(至少是 3.3.0 版,我们与之前的版本一起发布;也许这已经在我们升级到的更新版本中得到修复,但我想确定一下)有时是报告错误时向委托发送 nil,即使注释声称它是非空的。反过来,当我们尝试查看错误时,这会使我们的 Swift 代码崩溃。
假设我不想触摸上游标头,是否有任何方法可以覆盖标头中的可空性注释?如果我只是定义我的委托方法来接收一个Error?,我会收到一个警告。
如果标头包含在NS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_END中,并且标头中没有其他可以为空的指针,那么您可以创建一个包装标头来取消定义该宏并在最后重新定义它。就像是:
#ifdef NS_ASSUME_NONNULL_BEGIN
#undef NS_ASSUME_NONNULL_BEGIN
#endif
#ifdef NS_ASSUME_NONNULL_END
#undef NS_ASSUME_NONNULL_END
#endif
#import "header with bogus prototype.h"
#ifndef NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#endif
#ifndef NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
#endif
在这种情况下,您必须更新您的代码以始终包含您的包装标头而不是真正的标头。
不幸的是,如果有任何其他可空性注释,那么标头中的所有指针参数都必须定义它们的可空性。