[Swift 3.0] Swift3.0で、NSNotificationCenterはNotificationCenterになった

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

NSNotificationCenterは、アプリ内でオブジェクトに通知を送る仕組みとして、非常に多くの場面で利用されていると思います。 そして、このNSNotificationCenterも Swift 3.0で大きく変更が加えられました。

Xcodeの自動的な変換だけだと、addObserver(_:selector:name:object:)selectorの指定あたりで限界があり、ちょっと戸惑ったので、自分用の覚書として纏めました。

2 インスタンス

デフォルトのNotification Centerの取得ですが、NSが無くなったと同時に、けっこうシンプルになってます。

Swift 2.3

let nc = NSNotificationCenter.defaultCenter()

Swift 3.0

let nc = NotificationCenter.default

3 登録

selectorと、NotificationNameの大きく変化しており、ここが一番戸惑うところです。

Swift 2.3

.addObserver(self, selector: #selector(ViewController.update(_:)), name: "MyNotification", object: nil)

Swift3.0

.addObserver(self, selector: #selector(self.update), name: Notification.Name(rawValue:"MyNotification"), object: nil)

4 送信

Swift APIのガイドラインに従って、関数名が短くなっています。 第1パラメータのNotificationを指定するところですが、Swift 2.3では、Stringが使用できましたが、Swift 3.0では、それが無くなっているため、ここもちょっと戸惑いポイントだと思います。

Swift2.3

.postNotificationName("MyNotification", object: nil)

Swift3.0

.post(name: Notification.Name(rawValue:"MyNotification"), object: nil)

5 受信

一応、Notificationを受け取るようにしました。

Swift 2.3

func update(notification: NSNotification?) {
    print("Notificaton")
}

Swift 3.0

func update(notification: Notification?) {
    print("notification")
}

6 削除

変わっていません。

Swift 2.3 / Swift 3.0

.removeObserver(self)

7 ブロック形式

最後に、ブロック形式で使用する場合の例です。パターンは同じです。

var observer:AnyObject?

Swift 2.3

let nc = NSNotificationCenter.defaultCenter()
observer = nc.addObserverForName("MyNotification",
                                    object: nil,
                                    queue: nil,
                                    usingBlock:
    {( notification ) -> Void in
        print("Notification")
})
if (observer != nil) {
    NSNotificationCenter.defaultCenter().removeObserver(observer!)
}

Swift 3.0

let nc = NotificationCenter.default
observer = nc.addObserver(forName: NSNotification.Name(rawValue: "MyNotification"),
                            object: nil,
                            queue: nil,
                            using:
    {( notification ) -> Void in
        print("Notification")
})

if (observer != nil) {
    NotificationCenter.default.removeObserver(observer!)
}

8 最後に

NotificationCenterは、自動変換も限界があるので、しばらくこの覚書を頼りすると思います。(自分が、です。)

9 参考資料


API Reference NotificationCenter
API Reference NSNotificationCenter