bwin必赢体育:Name的正确姿势,的使用方式

作者:计算机知识

从前的出殡通告的参数就是三个粗略的字符串:

Swift 中使用文告,在写布告名称的时候,并无法像 Objective-C 那样轻巧方便,多个字符串解决。刚初阶自定义使用 Swift 公告时,以为各个不爽,要求如此写:

从今 斯维夫特3.0以来我一直使用 String 来代替Notification.Name,简化了代码也回到了贵宗过去对此 Notification 的认识.

(基于Swift3.0语法)都以挺轻易的直白相比吧

NSNotificationCenter.defaultCenter().post("someStringThatShouldBeDeclared")
Notification.Name("myNotification")
func  NotificationName(name : String) -> Notification.Name {
        return Notification.Name(name)
 }

使用时这样调用 
 NotificationCenter.default.addObserver(forName: NotificationName(name), object: obj, queue: queue, using: block)

bwin必赢体育:Name的正确姿势,的使用方式。1、KVO(键值观察)

@IBOutlet weak var kvoLab: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    self.kvoLab.addObserver(self, forKeyPath: "text", options: NSKeyValueObservingOptions.new, context: nil)
}

@IBAction func action_ClickButton(_ sender: UIButton) {
    self.kvoLab.text = "点击了(sender.tag)按钮"
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("keyPath = (keyPath)")
    print("object = (object)")
    print("context = ((object! as! UILabel).text!)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

后来到了swift 3 中,改成了Notification.Name。定义在Notification的命名空间下,是叁个构造体,初阶化函数选用三个字符串。

光取个名字就供给如此长一串代码,真的有悖于 Swift 给自身的这种简洁的影像。上边大家就来优化一下。

透过上边的函数能够依赖传入的 String 重回二个Notification.Name类型,固然在确定程度上简化了代码,不过感到依旧非常不够温婉,于是有了上面包车型大巴改革.

2、NSNotification(通知)

let notification = NSNotification.Name(rawValue: "notify")

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(textChange(notification:)), name: self.notification, object: nil)
}

@IBAction func action_ClickButton(_ sender: UIButton) {
    NotificationCenter.default.post(name: self.notification, object: nil, userInfo: ["text":sender.tag])
}

func textChange(notification: NSNotification) {
    print("notification = (notification)")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

连串地址:KVO&Notification

extension NSNotification { public struct Name : RawRepresentable, Equatable, Hashable, Comparable { public init(_ rawValue: String) public init(rawValue: String) }}

主意一:轻便无情的 Notification.Name 扩大


最简便的秘诀正是对 Notification.Name 进行扩充,代码如下:

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

动用的时候就能够用点开展调用了:

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

一晃儿大致了繁多。可是还非常不足,作者期望自定义的通有名称与系统的分手,而且只要三个编制程序半间半界的人或许还有只怕会犯 namespace 错误。斯威夫特中Notification.Name这么难用如何是好 那篇小说给了本身灵感。

对您未曾看错采取面向公约的主意对 Notification.Name 举行了开展

用起来就劳动了几许:

利用 Enum 定义自个儿的照望名称


率先大家要新建二个枚举类型 NotificationNames ,为了幸免 namespace 的难点,声圣元(Nutrilon卡塔尔个计量属性,增多三个前缀,有如从前 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这么难用怎么办

typealias NotificationName = Notification.Name
extension NotificationName : ExpressibleByStringLiteral {
    public typealias StringLiteralType = String
    public init(stringLiteral value: StringLiteralType) {
        self = Notification.Name.init(value)
    }
}
NotificationCenter.default.post(Notification.Name(rawValue: "MyNotificationName"))

那样也能够通过三个 String 快速生成一个 Notification.Name 类型,而且在应用时无需对 NotificationCenter 提供的函数进行任何的修改,你可以筛选选取 Notification.Name 和 String 类型进行函数的调用

本文由bwin必赢发布,转载请注明来源

关键词: 好东西 Swift Notification iOS开发记录 叫兽开发天地