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

时间:2017-10-19 06:29:19

标签: ios objective-c ios-frameworks

背景

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

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

来自

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

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

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

问题

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

在使用带有 Swift 的API时,似乎通过抛出错误来处理可空性。

但是,

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

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

UPD:

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

UPD#2:

到目前为止,我们已经接受了从Objective-C使用API​​的现实。但是,我们实现了“故障安全”行为:如果传递nil,则该方法在内部创建[ABCLocation default]实例并隐式传递它。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

不符合注释时生成警告是一种很好的做法。进行更改,例如nullable - > API中的nonnull不是。