Objective-C:在违反可空性注释时强制执行编译错误

Objective-C: enforce compile error upon nullability annotation violation

背景

我们一直在开发 public 动态 iOS / macOS 框架。该框架是用 Objective-C 编写的,但它与 Swift.

完全兼容

最近,我们更改了 public API 方法之一的可空性注释:

来自

- (void)setServer:(nullable ABCLocation *)location;

- (void)setServer:(nonnull ABCLocation *)location;

,因此开发人员需要创建 [ABCLocation default] 实例并将其传递给新的 API。

问题

现在,我们担心的是,如何强制/通知开发人员围绕我们的新 API 更改他们现有的代码?

将 API 与 Swift 一起使用时,它似乎通过抛出错误来很好地处理可空性。

但是,

Objective-C 仅在传递 nil 时生成警告,Xcode 不执行任何操作,当开发人员传递 nullable 属性 到方法。

我们如何强制开发人员更改他们的 API?这里的常见做法是什么?

更新:

我们将框架作为二进制文件分发,使用 Release 配置构建,断言已关闭。

UPD #2:

至此,我们已经接受了我们的API从Objective-C开始被使用的现实。但是,我们实现了 "fail safe" 行为:如果传递了 nil,该方法会在内部创建 [ABCLocation default] 实例并隐式传递它。

当您无法让编译器强制执行错误(如在您的实例中)时,一种常见的做法是抛出运行时错误。类似于:

- (void)setServer:(nonnull ABCLocation *)location    
{
    if (!location) {
        NSAssert(NO, @"Location must not be nil");
    }

它并不理想,但是对于错误使用您的框架的开发人员来说,传递 nil 时的编译器警告和误用时抛出的运行时错误的组合应该非常清楚。

不符合注释时生成警告是一个好习惯。在 API 中进行 nullable -> nonnull 之类的更改不是。