iOS项目头文件改造

之所以会有这篇文章, 是因为最近Swift5出来后, 公司项目有意向往混编的方向走, 而纯Objc的老项目嘛...emmmm, 直接用的话转成Swift后真的一言难尽, 所以为了让公司其他人更好的改写用到的头文件, 就整理了一下难用的Nullability到底怎么用会比较方便, 顺便看了一下互相转换的宏哪个还用得上

开始改造

首先是Nullability, 先简单粗暴的用:

NS_ASSUME_NONNULL_BEGIN
    
NS_ASSUME_NONNULL_END

把整个头文件包起来(import那几行不需要, 一般不包这几行)

这样整个头文件所有类型都默认是非optional的

然后再把需要变成可选的单独加上Nullability关键字即可:

而考虑到各种问题, 比如官方一般用nullable, 而有些地方只能用__nullable, 所以最简单总结起来就是:
  1. 无脑类型后缀__nullable就好(block是在^后缀)
  2. _Nullable就不要碰了, 混在一起容易乱
  3. 至于property里跟不跟官方用nullable? 推荐写成CodeSnippet自动生成然后不要碰了(其实也就strong和copy需要nullable):
@property (<#nullable, #>nonatomic, strong) <#Class#> *<#name#>;
@property (<#nullable, #>nonatomic, copy) NSString *<#name#>;

或者跟着官方的做法:

  1. 一般情况下无脑前缀nullable
  2. 遇到block相关的就类型后缀__nullable加以区分,也比较好记(block是在^后缀)
  3. _Nullable就不要碰了

不管选哪个, 重点其实是整个项目保持一致性才是最重要的


精致分割线


如果上面的总结不能帮到你, 具体解释就是:

  1. __nullable/_Nullable是编译器参数,需要放到类型后面,也就是NSString *__nullable这样

ps: OC里泛型是不能__nullable的, 我一时没想通傻试了好久, emmm...反应过来的时候差点笑死

  1. nullable是属性, 可以和strong/readonly一样放到property的括号里, 或者作为参数时和__weak一样前缀到变量类型前面:
para:(nullable NSString *)name

根据上面的规则就能衍变出:

property有两种写法

为了方便说明, copy/readonly这些称为property的属性

@property (copy) NSString *__nullable name;

@property (nullable, copy) NSString * name; // 本质还是前缀, 但property的属性需要写到括号里, 虽然这是官方写法, 但为了不要搞混最好不要记这个, 属性用CodeSnippet生成就好

ps1: property还有一种nullable属性null_resettable

字面意思就是setter可以传空, getter不能返回为空,编译器改写成Swift时会用!来表示, 如UIViewController.view就是null_resettable的:
@property(null_resettable, nonatomic,strong) UIView *view;//这里复制过来就这样的,苹果少打了一个空格

ps2: weak不能用nonnull

方法的返回值和参数也各自有两种写法:
- (NSString *__nullable)nameForItem:(NSString *__nullable)item;

- (nullable NSString *)nameForItem:(nullable NSString *)item;// 官方也是这种写法, 还是那句话, 不要记这个

最麻烦的是block

block作为property

它本身是不是optional需要在^后缀__nullable, 或者跟上面的property一样写成属性到括号里

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

@property (nullable, copy) void (^ aBlock)();
block做参数也是两种写法:

它本身是不是optioanl可以在^后缀__nullable, 前缀nullable, 但返回值和参数只能后缀__nullable

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

返回值前缀nullable会冲突这个很容易理解了, 所以反过来想, 大概是为了和返回值保持一致, 所以参数也只能后缀__nullable了吧...

ps: 如果nulable的block是最后一个参数, Swift会自动转换成带默认值nil

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

而普通类型的nullable变量则不会

最后是block的typedef

基本规则跟做参数是一样的, 但是定义这个type是不是optional跟做参数不同, 只能在^后缀__nullable(所以无脑类型后缀__nullable就好了):

typedef id __nullable (^__nullable ABlock)(id __nullable para);
还有一种 null_unspecified

代表不确定是不是为空, 这个一般用不上, 总之大概跟nullable的用法差不多, 同样有编译器参数__null_unspecified/_Null_unspecified

当既没有用ASSUME_NONNULL把头文件包起来, 也没有逐个添加Nullability时, 编译器就会默认用这个作为变量的Nullability

如果真的不能确定到底会不会为空(以后可能会为空), 可以用这个, 编译器改写成Swift时会用!来表示(和null_resettable一样, 区别是OC里的警告不同), 如:

@property (null_unspecified) id name;

会被改写成:

open var name: Any!

接着还有一个用于命名的关键字是
NS_SWIFT_NAME(<#swift专用名#>)
可以用于任意内容, 包括类名, 属性名, 枚举:

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:));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249