美文网首页
优化 Swift 中 Notification.Name 的使用

优化 Swift 中 Notification.Name 的使用

作者: TomatosX | 来源:发表于2018-03-23 12:29 被阅读48次

Swift 中使用通知,在写通知名称的时候,并不能像 Objective-C 那样简单方便,一个字符串搞定。刚开始自定义使用 Swift 通知时,感觉各种不爽,需要这样写:

Notification.Name("myNotification")

光取个名字就需要这么长一串代码,真的有悖于 Swift 给我的那种简洁的印象。下面我们就来优化一下。

方法一:简单粗暴的 Notification.Name 扩展


最简单的方式就是对 Notification.Name 进行扩展,代码如下:

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

使用的时候就能用点进行调用了:

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

一瞬间简单了不少。不过还不够,我希望自定义的通知名称与系统的分开,并且如果一个编程不规范的人可能还会犯 namespace 错误。Swift中Notification.Name这么难用怎么办 这篇文章给了我灵感。

使用 Enum 定义自己的通知名称


首先我们要新建一个枚举类型 NotificationNames ,为了避免 namespace 的问题,声明一个计算属性,添加一个前缀,就好像以前 Objective-C 的前缀 NS 一样。

enum NotificationNames: String {
    
    case myNotification
    
    var nameValue: String {
        return "NN" + rawValue
    }
    
    var notiName: Notification.Name {
        return Notification.Name(nameValue)
    }
}

再添加一个自定义的 post 函数,方便调用。

func post(_ name: NotificationNames, object myObject: AnyObject? = nil) {
        NotificationCenter.default.post(name: name.notiName, object: myObject)
    }

使用起来就简单了:

NotificationCenter.default.post(.myNotification, object: nil)

当在 NotificationNames 类型参数输入点的时候,就会很快的列出我们自定义的名称了。

类似的,RxSwift 版本的扩展如下:

extension Reactive where Base: NotificationCenter {

    func notification(_ myName: NotificationNames, object: AnyObject? = nil) -> Observable<Notification> {
        return notification(myName.notiName, object: object)
    }
}

使用如下:

NotificationCenter.default
        .rx.notification(.myNotification, object: nil)
        .subscribe(onNext: { _ in
            // code
        })
        .addDisposableTo(bag)

参考: Swift中Notification.Name这么难用怎么办

相关文章

网友评论

      本文标题:优化 Swift 中 Notification.Name 的使用

      本文链接:https://www.haomeiwen.com/subject/ifztcftx.html