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
之类的更改不是。
背景
我们一直在开发 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
之类的更改不是。