web-dev-qa-db-fra.com

Swift 3 - Comment utiliser la valeur brute enum comme NSNotification.Name?

J'utilise Xcode 8 beta 5 et j'essaie de configurer une énumération de notifications comme celle-ci

enum Notes: String {
  case note1
  case note2
}

Puis en essayant de les utiliser comme noms de notification

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

Mais je reçois une erreur.

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

Y a-t-il un travail à faire ou manque-t-il quelque chose? Cela fonctionne dans Xcode 7.3.1

Toute aide serait appréciée.

13
D. Greg

Voilà, utilisez 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)
    }
}

Autrement

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)
    }
}
32
user6375148

Je fais de cette façon, pour moi, c'est un moyen plus simple de gérer les noms de notification.

Swift 3.0 et Xcode 8.

En utilisant l'extension de Notification.Name, nous pouvons définir des noms statiques à l'intérieur comme suit.

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

Nous pouvons utiliser des noms comme celui-ci:

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

 func newPasscodeSetAction() {
     // Code Here.
 }

J'espère que cette méthode simple vous sera utile.

18
Gaurav Rami

Pour autant que je sache, il n'y avait pas de type NSNotification.Name in Swift 2.2.1/SDK inclus dans Xcode 7.3.1, donc je suis curieux de savoir comment vous l'avez fait fonctionner.

Quoi qu'il en soit, vous devez écrire quelque chose comme ceci si vous souhaitez utiliser votre énumération:

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

Soit dit en passant, ma meilleure recommandation pour définir votre propre Notification.Name utilise une extension qui définit les propriétés statiques:

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

(C'est un peu plus long qu'enum ..., mais) vous pouvez l'utiliser comme ceci:

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

Peut-être une autre approche dans Swift 4.2

extension Notification.Name{
   struct RecordListNotification {
        static let recordListDidChange:Notification.Name = Notification.Name("recordListDidChange")
        static let recordListTimeDidChange = Notification.Name("recordListTimeDidChange")
    }
}

puis

NotificationCenter.default.post(name: Notification.Name.RecordListNotification.recordListTimeDidChange, object: nil)

aussi pour éviter verbeux:

typealias RecordListNotification = Notification.Name.RecordListNotification

Et il peut être utilisé:

NotificationCenter.default.post(name: RecordListNotification.recordListTimeDidChange, object: nil)
1
Reimond Hill