看起来GoogleCastSDKforiOS(至少是我们之前发布的版本3.3.0;也许在我们升级到的最新版本中已经修复了这个问题,但我想确定)在报告错误时有时会向委托发送nils,即使注释声称它是非空的。反过来,当我们试图查看错误时,这会使我们的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

在这个场景中,您必须更新代码以始终包含包装头而不是真正的头。
不幸的是,如果有任何其他可空性注释,则必须定义头中的所有指针参数的可空性。

07-27 17:49