前言

在闲来无事的时候,我会抽时间看看Foundation、UIKit等相关库的Swift代码阐明与注释。说实话,有的时候看起来真的很庸俗,也不容易了解。

不过有的时候也会觉得Apple这么规划API真是书写的简略美丽,一脸敬服,今天给咱们分享的便是从NSNotification.Name学习一种代码编写方法,并且已经在我自己的项目中进行类似这种写法的落地实战分享。

OC年代的通闻名写法

NSNotification想必咱们都运用过,在iOS中处理跨非相邻页面、一对多的数据处理的时候,咱们一般便是经过发告诉传参,告之相关页面处理逻辑。

一般情况下,假如能够防止NSNotification的时候,我都会尽量防止运用,当然,既然体系给你了这个办法,那么在合适的场景运用也会妙手生花。

当然,对于NSNotification的通闻名的办理,其实是一个看似简略,实际上能够做得十分优雅的工作。

特别是从OC过渡到Swift的进程,这段简略的代码,其实进行了很大的演化,咱们无妨来看看。

下面这个是我早期写OC代码的时候,发送一个告诉:

[[NSNotificationCenter defaultCenter] postNotificationName:@"CancelActivateSuccessNotification" object:nil];

咱们留意看,通闻名,我便是十分简略的运用硬编码字符串@"CancelActivateSuccessNotification" 来表明,硬编码的缺点就不必我多说了,编译器是不会给提示的,写错了,甚至连告诉工作都没法收到,总之,这种写法是欠好的。

所以,看看体系代码以及AFNetworking,咱们会看见这样一种写法:

体系通闻名:

UIKIT_EXTERN NSNotificationName const UIApplicationDidFinishLaunchingNotification;

AFNetworking的通闻名,也是学习体系通闻名的写法进行的扩展:

.h文件

iOS:NSNotification.Name从OC到Swift的写法演进

.m文件

iOS:NSNotification.Name从OC到Swift的写法演进

看起来并不是太高超?或许的确如此,只不过经过.h与.m的分隔,将一个硬编码字符串变成了一个大局能够引用、IDE能够快速键入的方法,但是它至少让调用变得简略与安全,这样就足够了。

所以乎,OC年代通闻名的写法,咱们基本上都会用以上这种方法进行编写:

.h

UIKIT_EXTERN NSString *const CancelActivateSuccessNotification;

.m

NSString *const CancelActivateSuccessNotification = @"CancelActivateSuccessNotification";

Swift年代仍是这么写吗?

Swift年代的通闻名写法

其实Swift的早期,基本上仍是沿用着OC的这一套写法来写通闻名,不过在Swift4.2之后就迎来比较大的改动,让咱们来看看调用的API与源码:

open func post(name aName: NSNotification.Name, object anObject: Any?)
open func post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)

发告诉的时候,通闻名被一个NSNotification.Name类型替代了,咱们进去追着NSNotification.Name看:

iOS:NSNotification.Name从OC到Swift的写法演进

咱们一定要记住这种编码的书写方法,先送上定论:

  • 能够在一个类型里边再界说一个类型,咱们能够自己尝试。
  • 什么时候嵌套?为何要这么写?当嵌套的类型与外层界说的类型有着较强关联的时候能够这么写。

说完了这些,咱们能够看到在Swift中,发告诉,通闻名不再是一个字符串了,而是一个NSNotification.Name类型了。

那么在开发进程中,咱们如何运用呢?咱们无妨仍是从体系提供的API开始找:

iOS:NSNotification.Name从OC到Swift的写法演进

由于Swift能够到处编写一个类的分类,所以在一个类的分类中界说好该类的通闻名这种书写方法到处可见,这样的好处便是通闻名与类紧紧联系在一起,一来便于查找,二来便于绑定事务类型。

NotificationCenter.default.post(name: UIApplication.didFinishLaunchingNotification, object: nil)

上面这个告诉一宣布,经过通闻名我就知道是涉及UIApplication的操作行为。

说完了体系提供的API,咱们再来看看一些闻名第三方库是怎样界说吧,这里以Alamofire为例:

iOS:NSNotification.Name从OC到Swift的写法演进

Alamofire保持了和体系API相同的风格来界说通闻名。

咱们再来看看Kingfisher

iOS:NSNotification.Name从OC到Swift的写法演进

Kingfisher是在NSNotification.Name分类中扩展了通闻名。

顺带说一下,我自己办理与编写通闻名是这样的:

extension Notification.Name {
  enum LoginService {
    /// 退出
    static let logoutNotification = NSNotification.Name("logoutNotification")
  }
}
NotificationCenter.default.post(name: .LoginService.logoutNotification, object: nil)

经过在NSNotification.Name分类中进行二级事务扩展,细化通闻名。

至于咱们更喜欢哪一种写法,那便是仁者见仁智者见智的工作了。

总结

本篇文章从NotificationCenter发告诉的通闻名开始,对OC到Swift的写法演进进行梳理与阐明,举了体系API和著名第三方库的例子,给咱们讲解如何写好并办理好NSNotification.Name

吐槽

的这个编辑器,我直接从Xcode里边复制粘贴代码的体会真的很不友好,导致我比较长的代码都是截图,只要较少的代码运用的代码块。

自己写的项目,欢迎咱们star⭐️

RxStudy:RxSwift/RxCocoa结构,MVVM模式编写wanandroid客户端。

GetXStudy:运用GetX,重构了Flutter wanandroid客户端。