Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?

Posted

技术标签:

【中文标题】Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?【英文标题】:Swift 3 - How to use enum raw value as NSNotification.Name? 【发布时间】:2016-08-11 06:46:57 【问题描述】:

我正在使用 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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

给你,使用 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)
    

【讨论】:

我认为没有理由将 'enum MyNames' 放在 'extension Notification.Name' 中。这毫无意义。【参考方案2】:

我正在这样做,对我来说这是管理通知名称的更简单的方法。

Swift 3.0 和 Xcode 8.0

使用 Notification.Name 的扩展,我们可以在其中定义静态名称,如下所示。

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.
 

希望这个简单的方法对你有所帮助。

【讨论】:

【参考方案3】:

据我所知,在 Xcode 7.3.1 中捆绑的 Swift 2.2.1/SDK 中没有类型 NSNotification.Name,所以我很好奇你是如何让它工作的。

无论如何,如果你想利用你的枚举,你需要写这样的东西:

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)

【讨论】:

你是对的。 Swift 2.2 中没有 NSNotification.Name。我的意思是我可以只用原始值分配通知名称。我应该更清楚。 @D.Greg,感谢您的澄清。如您所知,Swift 测试版的变化如此之快,我担心我可能会遗漏一些东西。【参考方案4】:

也许是 swift 4.2 中的另一种方法

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

然后

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

也是为了避免冗长:

typealias RecordListNotification = Notification.Name.RecordListNotification

而且可以使用:

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

【讨论】:

谢谢。您还可以创建、构造和定义静态通知名称

以上是关于Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Swift的原始值中获取枚举?

带有浮点原始值的 Swift 枚举的“枚举大小写的原始值不是唯一的”

Swift枚举使用String值获取Int Enum的值

Swift 枚举

Swift-细说枚举(Enum)

Swift学习笔记:枚举