背景
我们一直在开发公共动态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时的编译器警告和误用时引发的运行时错误的组合应该非常清楚。