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.
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)
}
}
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.
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)
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)