iOS項(xiàng)目頭文件改造

之所以會(huì)有這篇文章, 是因?yàn)樽罱黃wift5出來(lái)后, 公司項(xiàng)目有意向往混編的方向走, 而純Objc的老項(xiàng)目嘛...emmmm, 直接用的話轉(zhuǎn)成Swift后真的一言難盡, 所以為了讓公司其他人更好的改寫(xiě)用到的頭文件, 就整理了一下難用的Nullability到底怎么用會(huì)比較方便, 順便看了一下互相轉(zhuǎn)換的宏哪個(gè)還用得上

開(kāi)始改造

首先是Nullability, 先簡(jiǎn)單粗暴的用:

NS_ASSUME_NONNULL_BEGIN
    
NS_ASSUME_NONNULL_END

把整個(gè)頭文件包起來(lái)(import那幾行不需要, 一般不包這幾行)

這樣整個(gè)頭文件所有類(lèi)型都默認(rèn)是非optional的

然后再把需要變成可選的單獨(dú)加上Nullability關(guān)鍵字即可:

而考慮到各種問(wèn)題, 比如官方一般用nullable, 而有些地方只能用__nullable, 所以最簡(jiǎn)單總結(jié)起來(lái)就是:
  1. 無(wú)腦類(lèi)型后綴__nullable就好(block是在^后綴)
  2. _Nullable就不要碰了, 混在一起容易亂
  3. 至于property里跟不跟官方用nullable? 推薦寫(xiě)成CodeSnippet自動(dòng)生成然后不要碰了(其實(shí)也就strong和copy需要nullable):
@property (<#nullable, #>nonatomic, strong) <#Class#> *<#name#>;
@property (<#nullable, #>nonatomic, copy) NSString *<#name#>;

或者跟著官方的做法:

  1. 一般情況下無(wú)腦前綴nullable
  2. 遇到block相關(guān)的就類(lèi)型后綴__nullable加以區(qū)分,也比較好記(block是在^后綴)
  3. _Nullable就不要碰了

不管選哪個(gè), 重點(diǎn)其實(shí)是整個(gè)項(xiàng)目保持一致性才是最重要的


精致分割線


如果上面的總結(jié)不能幫到你, 具體解釋就是:

  1. __nullable/_Nullable是編譯器參數(shù),需要放到類(lèi)型后面,也就是NSString *__nullable這樣

ps: OC里泛型是不能__nullable的, 我一時(shí)沒(méi)想通傻試了好久, emmm...反應(yīng)過(guò)來(lái)的時(shí)候差點(diǎn)笑死

  1. nullable是屬性, 可以和strong/readonly一樣放到property的括號(hào)里, 或者作為參數(shù)時(shí)和__weak一樣前綴到變量類(lèi)型前面:
para:(nullable NSString *)name

根據(jù)上面的規(guī)則就能衍變出:

property有兩種寫(xiě)法

為了方便說(shuō)明, copy/readonly這些稱(chēng)為property的屬性

@property (copy) NSString *__nullable name;

@property (nullable, copy) NSString * name; // 本質(zhì)還是前綴, 但property的屬性需要寫(xiě)到括號(hào)里, 雖然這是官方寫(xiě)法, 但為了不要搞混最好不要記這個(gè), 屬性用CodeSnippet生成就好

ps1: property還有一種nullable屬性null_resettable

字面意思就是setter可以傳空, getter不能返回為空,編譯器改寫(xiě)成Swift時(shí)會(huì)用!來(lái)表示, 如UIViewController.view就是null_resettable的:
@property(null_resettable, nonatomic,strong) UIView *view;//這里復(fù)制過(guò)來(lái)就這樣的,蘋(píng)果少打了一個(gè)空格

ps2: weak不能用nonnull

方法的返回值和參數(shù)也各自有兩種寫(xiě)法:
- (NSString *__nullable)nameForItem:(NSString *__nullable)item;

- (nullable NSString *)nameForItem:(nullable NSString *)item;// 官方也是這種寫(xiě)法, 還是那句話, 不要記這個(gè)

最麻煩的是block

block作為property

它本身是不是optional需要在^后綴__nullable, 或者跟上面的property一樣寫(xiě)成屬性到括號(hào)里

@property (copy) void (^__nullable aBlock)();

@property (nullable, copy) void (^ aBlock)();
block做參數(shù)也是兩種寫(xiě)法:

它本身是不是optioanl可以在^后綴__nullable, 前綴nullable, 但返回值和參數(shù)只能后綴__nullable

- (void)needABlock:(id __nullable (^__nullable)(id __nullable para))aBlock;
- (void)needABlock:(nullable id __nullable (^)(id __nullable para))aBlock;

返回值前綴nullable會(huì)沖突這個(gè)很容易理解了, 所以反過(guò)來(lái)想, 大概是為了和返回值保持一致, 所以參數(shù)也只能后綴__nullable了吧...

ps: 如果nulable的block是最后一個(gè)參數(shù), Swift會(huì)自動(dòng)轉(zhuǎn)換成帶默認(rèn)值nil

open func needABlock(_ aBlock: ((Any?) -> Void)? = nil)

而普通類(lèi)型的nullable變量則不會(huì)

最后是block的typedef

基本規(guī)則跟做參數(shù)是一樣的, 但是定義這個(gè)type是不是optional跟做參數(shù)不同, 只能在^后綴__nullable(所以無(wú)腦類(lèi)型后綴__nullable就好了):

typedef id __nullable (^__nullable ABlock)(id __nullable para);
還有一種 null_unspecified

代表不確定是不是為空, 這個(gè)一般用不上, 總之大概跟nullable的用法差不多, 同樣有編譯器參數(shù)__null_unspecified/_Null_unspecified

當(dāng)既沒(méi)有用ASSUME_NONNULL把頭文件包起來(lái), 也沒(méi)有逐個(gè)添加Nullability時(shí), 編譯器就會(huì)默認(rèn)用這個(gè)作為變量的Nullability

如果真的不能確定到底會(huì)不會(huì)為空(以后可能會(huì)為空), 可以用這個(gè), 編譯器改寫(xiě)成Swift時(shí)會(huì)用!來(lái)表示(和null_resettable一樣, 區(qū)別是OC里的警告不同), 如:

@property (null_unspecified) id name;

會(huì)被改寫(xiě)成:

open var name: Any!

接著還有一個(gè)用于命名的關(guān)鍵字是
NS_SWIFT_NAME(<#swift專(zhuān)用名#>)
可以用于任意內(nèi)容, 包括類(lèi)名, 屬性名, 枚舉:

NS_SWIFT_NAME(VoiceFilter)
@interface ABVoiceFilter : NSObject
@end

typedef NS_ENUM(NSUInteger, AType) {
    ATypeNone NS_SWIFT_NAME(NoneOne),
    ATypeOther NS_SWIFT_NAME(OtherPeople) ,
};

- (void)handleConnectItem:(id)connectionItem withParser:(id)parser NS_SWIFT_NAME(handle(item:parser:));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評(píng)論 3 422
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,947評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,201評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,350評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,549評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,753評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,007評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,834評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評(píng)論 2 375