对Notification.Name的正确姿势
2017-08-06 本文已影响87人
大兵布莱恩特
自从 Swift3.0以来作者一直使用 String 来替代Notification.Name,简化了代码也回到了大家以往对于 Notification 的认识.
func NotificationName(name : String) -> Notification.Name {
return Notification.Name(name)
}
使用时这样调用
NotificationCenter.default.addObserver(forName: NotificationName(name), object: obj, queue: queue, using: block)
通过上边的函数可以根据传入的 String 返回一个 Notification.Name类型,虽然在一定程度上简化了代码,但是觉得还是不够优雅,于是有了下边的改进.
对你没有看错采用面向协议的方式对 Notification.Name 进行了拓展
typealias NotificationName = Notification.Name
extension NotificationName : ExpressibleByStringLiteral {
public typealias StringLiteralType = String
public init(stringLiteral value: StringLiteralType) {
self = Notification.Name.init(value)
}
}
这样也可以通过一个 String 快速生成一个 Notification.Name 类型,而且在使用时不需要对 NotificationCenter 提供的函数进行任何的修改 ,你可以选择使用 Notification.Name 和 String 类型进行函数的调用
NotificationCenter.default.post(name: NSNotification.Name("Login"), object: nil)
NotificationCenter.default.post(name: "Login", object: nil)