Xcode10 NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END
前言
升級成 Xcode 10 之後每次 New File 看到 .h 基本都能看到NS_ASSUME_NONNULL_BEGIN 和NS_ASSUME_NONNULL_END 成對出現在 @interface 與 @end 上下, 包裹住它, 這兩對關鍵字並非新特性, 只是 Xcode 10 之後系統預設實現了, 應該是考慮到與 Swift 混編, 為了更好相容其 optional 與 non-optional。
原理
我們直接來看定義: NSObjectRuntime.h
#ifndef NS_ASSUME_NONNULL_BEGIN #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") #endif #ifndef NS_ASSUME_NONNULL_END #define NS_ASSUME_NONNULL_END_Pragma("clang assume_nonnull end")
其表示由 NS_ASSUME_NONNULL_BEGIN 開始以下定義的 物件都是 __nonnull 不可為空的, 直到 NS_ASSUME_NONNULL_END 作用域。
例如:
NS_ASSUME_NONNULL_BEGIN @interface YZHAddBookDetailsVC : YZHBaseViewController @property (nonatomic, copy) NSString* name; @property (nonatomic, strong) NSArray* array; @end NS_ASSUME_NONNULL_END
其表示name 和 array 都是由__nonnull修飾, 不可為空,當編譯時如果為空會受到警告。
與其 對應的是 __nullable, 表示物件也可以為 nil。
希望此篇文章對您有所幫助,如有不對的地方,希望大家能留言指出糾正。謝謝!!!!!
學習的路上,與君共勉!!!