Свифт 3 - Как использовать перечислимый сырое значение как NSNotification.Имя?

Я использую Xcode 8 beta 5, и я пытаюсь настроить перечисление уведомлений, как это

enum Notes: String {
  case note1
  case note2
}

затем пытается использовать их в качестве имен уведомлений

NotificationCenter.default.post(name: Notes.note1.rawValue as NSNotification.Name,
                                object: nil, userInfo: userInfo)

но я получаю ошибку.

Cannot convert value of type 'String' to specified type 'NSNotification.Name'

есть ли обойти, или я что-то пропустила? Он работает в Xcode 7.3.1

любая помощь будет оценили.

3 ответов


здесь вы идете, используйте Swift 3 & Xcode 8.0

enum Notes: String {

    case note1 = "note1"
    case note2 = "note2"

    var notification : Notification.Name  {
        return Notification.Name(rawValue: self.rawValue )
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.post(name: Notes.note2.notification ,object: nil, userInfo: nil)
    }
}

другой способ

import UIKit

extension Notification.Name
{
    enum MyNames
    {
        static let Hello = Notification.Name(rawValue: "HelloThere")
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.post(name: Notification.Name.MyNames.Hello ,object: nil, userInfo: nil)
    }
}

Я делаю так, для меня это более простой способ управления именами уведомлений.

Swift 3.0 и Xcode 8.0

С помощью расширения уведомления.Имя, мы можем определить статические имена внутри этого следующим образом.

extension Notification.Name {
    static let newPasscodeSet = Notification.Name("newPasscodeSet")
    static let userLoggedIn = Notification.Name("userLoggedIn")
    static let notification3 = Notification.Name("notification3")
}

мы можем использовать эти имена следующим образом:

 override func viewDidLoad() {
      NotificationCenter.default.addObserver(self, selector: #selector(self.newPasscodeSetAction), name: .newPasscodeSet, object: nil)
 }

 func newPasscodeSetAction() {
     // Code Here.
 }

надеюсь, что этот простой способ полезен для вас.


насколько я знаю, не было никакого типа NSNotification.Name в Swift 2.2.1 / SDKs в комплекте в Xcode 7.3.1, поэтому мне интересно,как вы это сделали.

в любом случае нужно писать что-то вроде этого, если вы хотите использовать свое перечисление:

NotificationCenter.default.post(name: NSNotification.Name(Notes.note1.rawValue),
                                object: nil, userInfo: userInfo)

кстати, моя лучшая рекомендация, чтобы определить свой собственный Notification.Name использует расширение, которое определяет статические свойства:

extension Notification.Name {
    static let note1 = NSNotification.Name("note1")
    static let note2 = NSNotification.Name("note2")
}

(Это немного дольше, чем перечисление..., а) вы можете использовать его как это:

NotificationCenter.default.post(name: .note1,
                                object: nil, userInfo: userInfo)