2017-10-19 73 views
2

背景的Objective-C:在非空註釋違反強制編譯錯誤

我們一直致力於開發公共動態的iOS/Mac系統框架。該框架是用Objective-C編寫的,但它與Swift完全兼容。

最近,我們已經改變了空性的註釋爲我們的公共API方法之一:

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

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

,因此開發者需要創建[ABCLocation default]實例,並通它到新的API。

問題

現在,我們關心的,如何執行/通知開發商來改變我們周圍的新的API,其存在的代碼?

當使用API​​與Swift,它似乎通過拋出一個錯誤很好地處理空性。

Objective-C的,雖然,僅生成時nil傳遞警告,Xcode中不執行任何操作,當開發者傳遞一個nullable屬性的方法。

我們如何強制開發人員更改他們的API?這裏常見的做法是什麼?

UPD:

我們分配框架作爲二進制,發佈配置,其中斷言關閉內置。

UPD#2:

到目前爲止,我們已經接受了現實,當我們的API從Objective-C的使用。但是,我們已經實現了「自動防故障」行爲:如果通過nil,則該方法在內部創建[ABCLocation default]實例並將其隱式傳遞。

+1

「當開發人員將可空屬性傳遞給方法時,Xcode不執行任何操作。」還有其他的錯誤,如果事實上是這樣的話,你應該得到警告。 – Mike

回答

1

註釋未滿足時生成警告是一種好的做法。在API中進行諸如nullable - >nonnull的更改不是。

+0

你能否特別提一下「在API中進行類似'nullable' - >'nonnull'的修改不是一個好習慣」? –

+0

我只是意味着在API中進行可疑的有用性的突破變化通常不是一個好主意 –

+0

同意。感謝您的幫助!正如我在** UPD#2 **中提到的那樣,爲了不破壞事情,我們添加了「故障安全」行爲。將您的答案標記爲已接受,它與我做出的最終決定相關。 –

1

當你不能讓編譯器強制執行一個錯誤(比如在你的實例中)時,一種常見的做法是拋出運行時錯誤。喜歡的東西:

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

它的不理想,但在零傳遞一個編譯器警告,並扔在濫用應該是非常清楚的使用框架的開發人員不正確運行時錯誤的組合。

+0

我們以使用* Release *配置構建的二進制形式分發框架,其中斷言處於關閉狀態。忘記提及它。我已經更新了這個問題。 –

相關問題