Objective-C:在违反可为null的注释时强制执行编译错误



背景

我们一直在开发公共动态iOS/AcOS框架。该框架是用Objective-C编写的,但它与Swift完全兼容。

最近,我们更改了一个公共API方法的nullability注释:

来自

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

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

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

问题

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

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

Objective-C仅在传递nil时生成警告,而当开发人员将nullable属性传递给该方法时,Xcode什么也不做。

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

UPD:

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

UPD#2:

到目前为止,我们已经接受了从Objective-C使用API的现实。然而,我们已经实现了一种"故障保护"行为:如果传递nil,则该方法在内部创建[ABCLocation default]实例并隐式传递它。

当不满足注释时生成警告是一种很好的做法。在API中进行nullable->nonnull之类的更改是不可行的。

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

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

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

最新更新