通过Notification.Name看Swift是如何优雅的解决String硬编码

2020-01-09 00:13:08丽君

前面

初学 Swift 中相关 NSNotification 的代码时, 发现了之前熟悉的 name 参数的类型由 Objective-C 中的 NSString 变成了 Notification.Name 类型. 并不是我期望的 String 类型...这是怎么回事呢?

Swift 中如何使用 Notification

那么, 在 Swift 中如何使用 Notification 呢, 以 post 为例.


NotificationCenter.default.post(name: Notification.Name.UIApplicationDidFinishLaunching, object: nil)

其中, Notification.Name 是可以省略的, 就变为了


NotificationCenter.default.post(name: .UIApplicationDidFinishLaunching, object: nil)

查看定义发现了 UIApplicationDidFinishLaunching 实际上是定义在结构体 NSNotification.Name 扩展(extension)中的的一个静态常量 (static let), 类型是 NSNotification.Name


extension NSNotification.Name {

 @available(iOS 4.0, *)
 public static let UIApplicationDidEnterBackground: NSNotification.Name

 @available(iOS 4.0, *)
 public static let UIApplicationWillEnterForeground: NSNotification.Name

 public static let UIApplicationDidFinishLaunching: NSNotification.Name
 ...
}

复制代码所以我们才可以省略前面的 Notification.Name 直接使用 .UIApplicationDidFinishLaunching (Notification.Name 是 NSNotification.Name 的别名)

那我们如果想自定义一个通知怎么办呢, 直接可以仿照系统的方式, 我们自己为其增加一个 extension


extension Notification.Name {
 static let LoginStatusChanged = Notification.Name("LoginStatusChanged")
}

其中 Notification.Name("LoginStatusChanged") 是其初始化方法, 可查看文档说明, 使用时, 可直接